当前位置: 首页 > news >正文

如何通过OceanBase V4.2 动态采样优化查询性能

OceanBase v4.2 推出了优化器动态采样的功能,在SQL运行过程中,该功能会收集需要的统计信息,协助优化器制定出更好的执行计划,进一步提升了查询性能。

影响查询性能的因素是什么?为何你的优化器效果不佳?

执行 SQL 查询的过程中,为了选出最优的执行计划,OceanBase 优化器需收集关于表和索引的统计信息。若这些统计信息存在误差或缺失,可能导致选择的执行计划不是最优的,进而影响查询性能下降。通常,基本的统计信息可通过自动或手动方式收集。但是,有些情况下统计信息可能不准确,例如,数据分布发生变化、没有收集统计信息或者遇到一些复杂的SQL 查询。

例如,这里有 两张1000 行数据的表 t1和t2,假如两个表都没有收集统计信息。​​​​​​​

create table t1(c1 int, c2 int, c3 int);
create table t2(c1 int, c2 int, c3 int);
create index idx_c1 on t2(c1);
insert into t1 select level,level,level from dual connect by level<=1000;
insert into t2 select level,level,level from dual connect by level<=1000;

我们看看查询 “select * from t1, t2 where t1.c1 = t2.c1 and t1.c2 = 1000” 的计划情况:

| ===========================================                                                 |
| |ID|OPERATOR   |NAME|EST.ROWS|EST.TIME(us)|                                                 |
| -------------------------------------------                                                 |
| |0 |HASH JOIN  |    |98      |199         |                                                 |
| |1 | TABLE SCAN|T1  |10      |44          |                                                 |
| |2 | TABLE SCAN|T2  |1000    |61          |                                                 |
| ===========================================                                                 |

可以看到上述两表JOIN的方式选择的是 HASH JOIN。但是真实情况是,满足 t1.c2 = 1000 的数据只有一行,此时,我们可以选择走 NESTED-LOOP JOIN,将连接条件 t1.c1 = t2.c1 下压到基表 t2 上,从而 t2 表也可以选择索引 idx_c1,整个计划执行性能也会更快。形如下面的查询计划,这个计划的执行性能会更好:

=============================================================                               |
| |ID|OPERATOR               |NAME      |EST.ROWS|EST.TIME(us)|                               |
| -------------------------------------------------------------                               |
| |0 |NESTED-LOOP JOIN       |          |1       |21          |                               |
| |1 | TABLE SCAN            |T1        |1       |2           |                               |
| |2 | DISTRIBUTED TABLE SCAN|T2(IDX_C1)|1       |18          |                               |
| =============================================================

综上,我们需要一种技术手段来辅助获取更准确的统计信息,帮助优化器选择更好的执行计划。在业界当中,提出了一种动态采样的优化技术手段,为了使优化器得到足够多的统计信息,动态采样会在计划生成阶段针对数据库对象进行提前采样,通过采样的方式进行行数估计,从而用于代价模型中,生成更好的执行计划。

OceanBase 4.2 提供了全新的动态采样功能,帮助解决上述痛点。它有着如下的优点:

  • 可以在缺乏统计信息的情况下获得更准确的统计信息;
  • 可以在包含复杂谓词、关联谓词等查询中提供更加准确的统计信息;
  • 可以减少统计数据收集的时间和成本,比如针对大宽表,常规的统计信息收集可能会非常耗时和资源;
  • 可以提高查询的时效性,因为动态采样可以在查询时动态调整执行计划,以适应数据的变化。

如何最大化利用动态采样?如何将动态采样用到极致?

你只要升级到 OceanBase v4.2,无需任何额外操作,就会自动拥有全新的动态采样功能。升级之后,优化器会根据 SQL 查询语句决定是否开启动态采样功能,以使得生成的计划更加精准,执行更加高效。

应用动态采样的三个场景

目前动态采样功能默认生效于用户SQL,当前只支持基表的动态采样。在没有关闭动态采样功能时,以下场景会尝试在计划生成阶段使用动态采样:

  • 没有任何统计信息可用。
  • 查询条件中存在复杂谓词,比如 "c1 like '%test%' ",无法用选择率计算公式进行行数估计。
  • 用户指定使用动态采样。

动态采样的三种控制手段

OceanBase v4.2 提供了系统变量、查询 HINT及系统配置项三种方式进行动态采样功能的控制,同时动态采样的采样集大小受限于并行度的控制。

方式一:系统变量控制。

optimizer_dynamic_sampling 系统变量当前实现仅仅做如下划分:

  • 0:==> 关闭动态采样功能;
  • 1:==> 开启动态采样功能;
"optimizer_dynamic_sampling": {"name": "optimizer_dynamic_sampling","value": "1","data_type": "int","info": "control dynamic sample level","flags": "GLOBAL | SESSION | NEED_SERIALIZE","min_val": "0","max_val": "1",}

方式二:查询 HINT 控制。

动态采样支持指定 HINT 来控制查询是否使用动态采样,具体的用法如下:

DYNAMIC_SAMPLING '(' dynamic_sampling_hint ')'dynamic_sampling_hint:
INTNUM1
| qb_name_option relation_factor_in_hint opt_comma INTNUM

为了便于大家理解,对上述命令中的专有名词作简要介绍。

  • qb_name_option:Query Block的名字(可选)。
  • relation_factor_in_hint:控制动态采样的表名(可选,为空表示整个查询使用动态采样)。
  • INTNUM:指定采样的LEVEL(目前只支持0或者1,参考系统变量定义)。

方式三:系统配置项控制。

动态采样的最大可用查询时间默认是当前查询时间的1/10,比如一个查询的超时时间是10s,那么动态采样的最大时间是1s,同时为了防止动态采样的时间过大,增加了一个默认配置项(_optimizer_ads_time_limit)来控制动态采样的一个时间上限,默认时间上限是10秒,如果配置为0,即关闭动态采样功能。

DEF_INT(_optimizer_ads_time_limit, OB_TENANT_PARAMETER, "10", "[0, 300]","the maximum optimizer dynamic sampling time limit. Range: [0, 300]",ObParameterAttr(Section::TENANT, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE));

动态采样原理介绍

为了方便大家更容易理解动态采样的原理,列举如下例子说明。

create table t1(c1 int, c2 int, c3 int, c4 int);
create index idx_c1 on t1(c1);Q1: select c4 from t1 where c1 > 1 and c2 > 1 and c3 > 1 group by c4;

首先基表路径会生成3条路径:

  • 主表路径;
  • 索引表路径 idx_c1;

然后动态采样基于上述3条路径构建采样SQL:

  • 基表的行数估计:count(*);
  • c4 列的基础统计信息:approx_count_distinct(c4)、sum(case when c4 is null then 1 else 0 end);
  • 满足所有谓词的行数估计:sum(case when c1 > 1 and c2 > 1 and c3 > 1 then 1 else 0 end);
  • 满足索引表路径 idx_c1 的query range行数估计:sum(case when c1 > 1 then 1 else 0 end);

同时基于微块个数(默认采样微块个数:32)计算其采样率,假设Q1的采样率为 ratio;构建如下采样的SQL:

DYNAMIC SAMPLING Q1: 
SELECT
/*+ NO_REWRITENO_PARALLELDYNAMIC_SAMPLING(0)QUERY_TIMEOUT(1000000)
*/ 
count(*),
approx_count_distinct("C4"),
Sum(CASE WHEN "C4" IS NULL THEN 1 ELSE 0 END),
Sum(CASE WHEN ( "C1" > 1 ) AND ( "C2" > 1 ) AND ( "C3" > 1 ) THEN 1 ELSE 0 END),
Sum(CASE WHEN ( "C1" > 1 ) THEN 1 ELSE 0 END)
FROM "TEST"."T1" SAMPLE BLOCK(ratio) SEED(seed);

为了便于大家理解,对上述命令中的专有名词作简要介绍。

  • NO_REWRITE:不需要走改写路径,基表扫描,没有必要。
  • NO_PARALLEL:不开启并行,由于原始SQL未显示指定,默认不走并行采样。
  • DYNAMIC_SAMPLING(0):动态采样SQL不能走动态采样。
  • QUERY_TIMEOUT:采样时间SQL的查询时间上限。

从以上的例子中可以看到,动态采样会结合当前 SQL 查询的具体情况采样该 SQL计划生产必要的统计信息;比如,采样满足索引路径的行数用于计划路径的选择,同时采样了 c4 列的 NDV(不同值个数)用于准确的 group by 分组数估计等。

动态采样典型示例

以 100G TPCH 的 Q9 查询为例:

SELECT /*TPC-H Q9*/ nation,o_year,SUM(amount) AS SUM_PROFIT
FROM   (SELECT n_nameASNATION,Date_format(o_orderdate, '%Y')ASO_YEAR,l_extendedprice * ( 1 - l_discount ) - ps_supplycost * l_quantityASAMOUNTFROM   part,supplier,lineitem,partsupp,orders,nationWHERE  s_suppkey = l_suppkeyAND ps_suppkey = l_suppkeyAND ps_partkey = l_partkeyAND p_partkey = l_partkeyAND o_orderkey = l_orderkeyAND s_nationkey = n_nationkeyAND p_name LIKE '%%green%%') AS PROFIT
GROUP  BY nation,o_year
ORDER  BY nation,o_year DESC; 

Q9 查询中 part 表有一个 like 条件: p_name LIKE '%%green%%';由于是前缀为 '%' 的 like 条件,即使在有统计信息直方图存在的情况下也无法使用直方图估计出准确的行数,如下是有统计信息,未使用动态采样的一个计划:

+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Query Plan                                                                                                                                                                         |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ==============================================================================================                                                                                     |
| |ID|OPERATOR                                                 |NAME    |EST.ROWS |EST.TIME(us)|                                                                                     |
| ----------------------------------------------------------------------------------------------                                                                                     |
| |0 |PX COORDINATOR MERGE SORT                                |        |40535    |3585766951  |                                                                                     |
| |1 |└─EXCHANGE OUT DISTR                                     |:EX10005|40535    |3585737336  |                                                                                     |
| |2 |  └─SORT                                                 |        |40535    |3585670790  |                                                                                     |
| |3 |    └─HASH GROUP BY                                      |        |40535    |3585651224  |                                                                                     |
| |4 |      └─EXCHANGE IN DISTR                                |        |40535    |3585635622  |                                                                                     |
| |5 |        └─EXCHANGE OUT DISTR (HASH)                      |:EX10004|40535    |3585606007  |                                                                                     |
| |6 |          └─HASH GROUP BY                                |        |40535    |3585539461  |                                                                                     |
| |7 |            └─HASH JOIN                                  |        |191316128|3565126187  |                                                                                     |
| |8 |              ├─PX PARTITION ITERATOR                    |        |150000000|7498533     |                                                                                     |
| |9 |              │ └─TABLE FULL SCAN                        |ORDERS  |150000000|7498533     |                                                                                     |
| |10|              └─EXCHANGE IN DISTR                        |        |191316128|3499839258  |                                                                                     |
| |11|                └─EXCHANGE OUT DISTR (PKEY)              |:EX10003|191316128|3237072719  |                                                                                     |
| |12|                  └─HASH JOIN                            |        |191316128|2646062477  |                                                                                     |
| |13|                    ├─HASH JOIN                          |        |25507206 |183664333   |                                                                                     |
| |14|                    │ ├─TABLE FULL SCAN                  |NATION  |25       |5           |                                                                                     |
| |15|                    │ └─EXCHANGE IN DISTR                |        |25507206 |180401231   |                                                                                     |
| |16|                    │   └─EXCHANGE OUT DISTR             |:EX10001|25507206 |150431919   |                                                                                     |
| |17|                    │     └─HASH JOIN                    |        |25507206 |83037644    |                                                                                     |
| |18|                    │       ├─PX PARTITION ITERATOR      |        |1000000  |58063       |                                                                                     |
| |19|                    │       │ └─TABLE FULL SCAN          |SUPPLIER|1000000  |58063       |                                                                                     |
| |20|                    │       └─EXCHANGE IN DISTR          |        |26792540 |79377144    |                                                                                     |
| |21|                    │         └─EXCHANGE OUT DISTR (PKEY)|:EX10000|26792540 |58029448    |                                                                                     |
| |22|                    │           └─PX PARTITION ITERATOR  |        |26792540 |10051824    |                                                                                     |
| |23|                    │             └─MERGE JOIN           |        |26792540 |10051824    |                                                                                     |
| |24|                    │               ├─TABLE FULL SCAN    |PART    |6666667  |1536384     |                                                                                     |
| |25|                    │               └─TABLE FULL SCAN    |PARTSUPP|80000000 |6419953     |                                                                                     |
| |26|                    └─EXCHANGE IN DISTR                  |        |600037902|2380208653  |                                                                                     |
| |27|                      └─EXCHANGE OUT DISTR               |:EX10002|600037902|1675203055  |                                                                                     |
| |28|                        └─PX PARTITION ITERATOR          |        |600037902|89803225    |                                                                                     |
| |29|                          └─TABLE FULL SCAN              |LINEITEM|600037902|89803225    |                                                                                     |
| ==============================================================================================   

计划中的 No.24 TABLE FULL SCAN 算子即是当前利用统计信息估算的一个 part 满足条件 sp_name LIKE '%%green%%'的行数,估计结果是 6666667;继续看看满足条件的真实行数:

obclient> select count(*) from part;
+----------+
| COUNT(*) |
+----------+
| 20000000 |
+----------+
1 row in set (0.08 sec)obclient> select count(*) from part where p_name LIKE '%%green%%';
+----------+
| COUNT(*) |
+----------+
|  1087982 |
+----------+
1 row in set (1.92 sec)

可以看见,上述通过统计信息估算的行数和真实的值是偏差很大的,主要原因是由于前缀为 '%' 的 like 条件不能直接利用直方图估计行数,只能使用默认的一个 like 条件选择率来进行估算,导致出现了如此大的偏差。

接下来看看开启动态采样之后的计划:

+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Query Plan                                                                                                                                                                                                      |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ==============================================================================================                                                                                                                  |
| |ID|OPERATOR                                                 |NAME    |EST.ROWS |EST.TIME(us)|                                                                                                                  |
| ----------------------------------------------------------------------------------------------                                                                                                                  |
| |0 |PX COORDINATOR MERGE SORT                                |        |40535    |2690273793  |                                                                                                                  |
| |1 |└─EXCHANGE OUT DISTR                                     |:EX10005|40535    |2690244178  |                                                                                                                  |
| |2 |  └─SORT                                                 |        |40535    |2690177632  |                                                                                                                  |
| |3 |    └─HASH GROUP BY                                      |        |40535    |2690158066  |                                                                                                                  |
| |4 |      └─EXCHANGE IN DISTR                                |        |40535    |2690142464  |                                                                                                                  |
| |5 |        └─EXCHANGE OUT DISTR (HASH)                      |:EX10004|40535    |2690112849  |                                                                                                                  |
| |6 |          └─HASH GROUP BY                                |        |40535    |2690046303  |                                                                                                                  |
| |7 |            └─HASH JOIN                                  |        |35817406 |2686210979  |                                                                                                                  |
| |8 |              ├─EXCHANGE IN DISTR                        |        |35817406 |2648259525  |                                                                                                                  |
| |9 |              │ └─EXCHANGE OUT DISTR (PKEY)              |:EX10003|35817406 |2599065472  |                                                                                                                  |
| |10|              │   └─HASH JOIN                            |        |35817406 |2488419004  |                                                                                                                  |
| |11|              │     ├─HASH JOIN                          |        |4775353  |41041962    |                                                                                                                  |
| |12|              │     │ ├─TABLE FULL SCAN                  |NATION  |25       |5           |                                                                                                                  |
| |13|              │     │ └─EXCHANGE IN DISTR                |        |4775353  |40431048    |                                                                                                                  |
| |14|              │     │   └─EXCHANGE OUT DISTR             |:EX10001|4775353  |34820319    |                                                                                                                  |
| |15|              │     │     └─HASH JOIN                    |        |4775353  |22203044    |                                                                                                                  |
| |16|              │     │       ├─PX PARTITION ITERATOR      |        |1000000  |58063       |                                                                                                                  |
| |17|              │     │       │ └─TABLE FULL SCAN          |SUPPLIER|1000000  |58063       |                                                                                                                  |
| |18|              │     │       └─EXCHANGE IN DISTR          |        |5015988  |21290037    |                                                                                                                  |
| |19|              │     │         └─EXCHANGE OUT DISTR (PKEY)|:EX10000|5015988  |17293410    |                                                                                                                  |
| |20|              │     │           └─PX PARTITION ITERATOR  |        |5015988  |8311240     |                                                                                                                  |
| |21|              │     │             └─MERGE JOIN           |        |5015988  |8311240     |                                                                                                                  |
| |22|              │     │               ├─TABLE FULL SCAN    |PART    |1248106  |1326869     |                                                                                                                  |
| |23|              │     │               └─TABLE FULL SCAN    |PARTSUPP|80000000 |6419953     |                                                                                                                  |
| |24|              │     └─EXCHANGE IN DISTR                  |        |600037902|2380208653  |                                                                                                                  |
| |25|              │       └─EXCHANGE OUT DISTR               |:EX10002|600037902|1675203055  |                                                                                                                  |
| |26|              │         └─PX PARTITION ITERATOR          |        |600037902|89803225    |                                                                                                                  |
| |27|              │           └─TABLE FULL SCAN              |LINEITEM|600037902|89803225    |                                                                                                                  |
| |28|              └─PX PARTITION ITERATOR                    |        |150000000|7498533     |                                                                                                                  |
| |29|                └─TABLE FULL SCAN                        |ORDERS  |150000000|7498533     |                                                                                                                  |
| ============================================================================================== 

可以看到利用动态采样估算出来的 No.22 TABLE FULL SCAN算子的行数为:1248106,和真实的行数是接近的,是会优于使用统计信息去估算行数的。

动态采样会影响硬解析时间吗?

由于动态采样需要在计划生成的时候进行数据采样、统计信息收集,这势必会增大SQL的硬解析时间。通过内部测试来看,使用动态采样的额外解析时间在毫秒级别。为了减少采样的次数,避免频繁采样,也引入了动态采样的 cache 机制。针对每次采样的结果会缓存下来,优先利用缓存的采样结果,避免无效的采样,增大 SQL 硬解析的时间。同时,针对缓存的结果会结合每个表的增删改情况,弃用已经失效的采样结果,保证采样的准确性。因此整体来看动态采样对于硬解析的额外开销还是相对可控的。

总结

动态采样为了使优化器得到足够多的统计信息,会在计划生成阶段提前对数据库对象进行采样,通过采样的方式进行行数估计,从而用于代价模型中,生成更好的计划。动态采样丰富了优化器获取统计信息的手段,在统计信息不可用或者无法提供准确的行数估计时,提供一种更好的解决方案。但是在使用动态采样功能的时候,需要注意以下几点:

  • 由于动态采样默认使用的是块采样,因此建议导入数据之后做相应的转储合并变更,以获得更好的采样效果。
  • 动态采样难免带来部分硬解析的时间额外开销,部分 TP 场景的业务如果无法忍受,可以选择关闭该功能。
  • 动态采样仅作为统计信息收集的一种补充手段,业务场景不要完全依赖于该功能,基础的统计信息收集还是需要做的。

相关文章:

如何通过OceanBase V4.2 动态采样优化查询性能

OceanBase v4.2 推出了优化器动态采样的功能&#xff0c;在SQL运行过程中&#xff0c;该功能会收集需要的统计信息&#xff0c;协助优化器制定出更好的执行计划&#xff0c;进一步提升了查询性能。 影响查询性能的因素是什么&#xff1f;为何你的优化器效果不佳&#xff1f; …...

Vue3---基础1(认识,创建)

变化 相对于Vue2&#xff0c;Vue3的变化&#xff1a; 性能的提升 打包大小减少 41% 初次渲染快 55%&#xff0c;更新渲染快133% 内存减少54% 源码的升级 使用 proxy 代替 defineProperty 实现响应式 重写虚拟 DOM 的实现和 Tree-shaking TypeScript Vue3就可以更好的支持TypeSc…...

JAVA集合ArrayList

目录 ArrayList概述 add(element) 用法 add(index, element)用法 remove&#xff08;element&#xff09;用法 remove&#xff08;index&#xff09;用法 get(index)用法 set(index,element) 练习 test1 定义一个集合&#xff0c;添加字符串&#xff0c;并进行遍历&…...

Bitmap OOM

老机器Bitmap预读仍然OOM&#xff0c;无奈增加一段&#xff0c;终于不崩溃了。 if (Build.VERSION.SDK_INT < 21)size 2; 完整代码&#xff1a; Bitmap bitmap; try {//Log.e(Thread.currentThread().getStackTrace()[2] "", surl);URL url new URL(surl);…...

基于深度学习的人脸表情识别系统(PyQT+代码+训练数据集)

基于深度学习的人脸表情识别系统&#xff08;PyQT代码训练数据集&#xff09; 前言一、数据集1.1 数据集介绍1.2 数据预处理 二、模型搭建三、训练与测试3.1 模型训练3.2 模型测试 四、PyQt界面实现 前言 本项目是基于mini_Xception深度学习网络模型的人脸表情识别系统&#x…...

Qt 中的项目文件解析和命名规范

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、Qt项目文件解析 1、.pro 文件解析 2、widget.h 文件解析 3、main.cpp 文件解析 4、widget.cpp…...

【chatGPT】我:在Cadence Genus软件中,出现如下问题:......【4】

我 在Cadence Genus中&#xff0c;tcl代码为&#xff1a;foreach clk $clk_list{ set clkName [lindex $clk_list 0] set targetFreq [lindex $clk_list 1] set uncSynth [lindex $clk_list 4] set clkPeriod [lindex “%.3f” [expr 1 / $targetFreq]] … } 以上代码出现如下…...

单例模式(Singleton Pattern)在JAVA中的应用

在软件开发中&#xff0c;设计模式是解决特定问题的一种模板或者指南。它们是在多年的软件开发实践中总结出的有效方法。JAVA设计模式广泛应用于各种编程场景中&#xff0c;以提高代码的可读性、可维护性和扩展性。本文将介绍单例模式&#xff0c;这是一种常用的创建型设计模式…...

手把手教你创建新的OpenHarmony 三方库

创建新的三方库 创建 OpenHarmony 三方库&#xff0c;建议使用 Deveco Studio&#xff0c;并添加 ohpm 工具的环境变量到 PATH 环境变量。 创建方法 1&#xff1a;IDE 界面创建 在现有应用工程中&#xff0c;新创建 Module&#xff0c;选择"Static Library"模板&a…...

从零开始,如何成功进入IT行业?

0基础如何进入IT行业&#xff1f; 简介&#xff1a;对于没有任何相关背景知识的人来说&#xff0c;如何才能成功进入IT行业&#xff1f;是否有一些特定的方法或技巧可以帮助他们实现这一目标&#xff1f; 在当今数字化时代&#xff0c;IT行业无疑是一个充满活力和机遇的领域。…...

【数组】5螺旋矩阵

这里写自定义目录标题 一、题目二、解题精髓-循环不变量三、代码 一、题目 给定⼀个正整数 n&#xff0c;⽣成⼀个包含 1 到 n^2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的正⽅形矩阵。 示例: 输⼊: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 二、解题精髓…...

Sora视频生成模型:开启视频创作新纪元

随着人工智能技术的飞速发展&#xff0c;视频生成领域也迎来了前所未有的变革。Sora视频生成模型作为这一领域的佼佼者&#xff0c;凭借其卓越的性能和创新的应用场景&#xff0c;受到了广泛的关注与好评。本文将对Sora视频生成模型进行详细介绍&#xff0c;带您领略其魅力所在…...

OpenAI现已普遍提供带有视觉应用程序接口的GPT-4 Turbo

OpenAI宣布&#xff0c;其功能强大的GPT-4 Turbo with Vision模型现已通过公司的API全面推出&#xff0c;为企业和开发人员将高级语言和视觉功能集成到其应用程序中开辟了新的机会。 PS&#xff1a;使用Wildcard享受不受网络限制的API调用&#xff0c;详情查看教程 继去年 9 月…...

Swift中的元组属性

在Swift中&#xff0c;元组属性指的是一个元组作为结构体、类或枚举的属性。可以将一个元组作为属性来存储和访问多个值。 例如&#xff0c;考虑以下的Person类&#xff1a; class Person {var name: Stringvar age: Intvar address: (String, Int)init(name: String, age: I…...

【go从入门到精通】作用域,包详解

作者简介&#xff1a; 高科&#xff0c;先后在 IBM PlatformComputing从事网格计算&#xff0c;淘米网&#xff0c;网易从事游戏服务器开发&#xff0c;拥有丰富的C&#xff0c;go等语言开发经验&#xff0c;mysql&#xff0c;mongo&#xff0c;redis等数据库&#xff0c;设计模…...

利用SARscape对日本填海造陆和天然气开采进行地表形变监测

日本千叶市&#xff0c;是日本南部重要的工业港市。位于西部的浦安市是一个典型的"填海造田"城市&#xff0c;东南部的东金区有一片天然气开采区域&#xff0c;本文利用SARscape&#xff0c;用干涉叠加的方法&#xff0c;即PS和SBAS&#xff0c;对这两个区域进行地表…...

“Python爬虫实战:高效获取网上公开美图“

如何通过Python创建一个简单的网络爬虫&#xff0c;以爬取网上的公开图片。网络爬虫是一种自动化工具&#xff0c;能够浏览互联网、下载内容并进行处理。请注意&#xff0c;爬取内容时应遵守相关网站的使用条款&#xff0c;尊重版权和隐私权。 ### 网络爬虫简介 网络爬虫&…...

C++设计模式:享元模式(十一)

1、定义与动机 概述&#xff1a;享元模式和单例模式一样&#xff0c;都是为了解决程序的性能问题。面向对象很好地解决了"抽象"的问题&#xff0c;但是必不可免得要付出一定的代价。对于通常情况来讲&#xff0c;面向对象的成本大豆可以忽略不计。但是某些情况&#…...

【三十六】【算法分析与设计】综合练习(3),39. 组合总和,784. 字母大小写全排列,526. 优美的排列

目录 39. 组合总和 对每一个位置进行枚举 枚举每一个数出现的次数 784. 字母大小写全排列 526. 优美的排列 结尾 39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不…...

ARM Cordio WSF(一)——架构简介

1. 关于WSF WSF&#xff08;wireless Software Foundation API&#xff09;&#xff0c;是一个RTOS抽象层。Wireless Software Foundation software service and porting layer&#xff0c;提供实时操作系统所需的基础服务&#xff0c;可基于不同平台进行实现&#xff0c;移植…...

设计模式总结-装饰者模式

模式动机 一般有两种方式可以实现给一个类或对象增加行为&#xff1a; 继承机制&#xff0c;使用继承机制是给现有类添加功能的一种有效途径&#xff0c;通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的&#xff0c;用户不能控制增…...

Stunnel网络加密服务

简介&#xff1a; Stunnel是一个用于创建SSL加密隧道的工具&#xff0c;针对本身无法进行TLS或SSL通信的客户端及服务器&#xff0c;Stunnel 可提供安全的加密连接。可以用于保护服务器之间的通信。您可以在每台服务器上安装Stunnel&#xff0c;并将其配置为在公网上加密传输数…...

算法练习第16天|101. 对称二叉树

101. 对称二叉树 力扣链接https://leetcode.cn/problems/symmetric-tree/description/ 题目描述&#xff1a; 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#x…...

YOLOV8实战教程——最新安装(截至24.4)

前言&#xff1a;YOLOV8更新比较快&#xff0c;最近用的时候发现有些地方已经跟之前不一样&#xff0c;甚至安装都会出现差异&#xff0c;所以做一个最新版的 yolov8 安装教程 一、Github 或者 GitCode 搜索 ultralytics 下载源码包&#xff0c;下载后解压到你需要安装的位置…...

redis zremove删除不掉【bug】

redis zremove删除不掉【bug】 前言版权redis zremove删除不掉错误产生相关资源EldDataEchartsTestDataService 解决 最后 前言 2024-4-12 20:35:21 以下内容源自《【bug】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星…...

对象的本地保存

对象的本地保存 对象的创建和保存 对象的特点&#xff1a; 对象“生活”在内存空间中&#xff0c;因此&#xff0c;程序一旦关闭&#xff0c;这些对象也都会被CLR的垃圾回收机制销毁。程序第二次运行时&#xff0c;对象会以“全新”的状态出现,无法保留上次对象的运行状态。…...

PostgreSQL入门到实战-第二十一弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(五)官网地址PostgreSQL概述PostgreSQL中RIGHT JOIN命令理论PostgreSQL中RIGHT JOIN命令实战更新计划 PostgreSQL中表连接操作(五) 使用PostgreSQL RIGHT JOIN连接两个表&#xff0c;并从右表返回行 官网地址 声明: 由于操作系统…...

李彦宏放话:百度AI大模型绝不抢开发者饭碗

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 昨晚&#xff0c;李彦宏内部讲话称&#xff1a;AI大模型开源意义不大&#xff0c;百度绝不抢开发者饭碗。 但你一定要说话算话哦&#xff0c;可千万别说&#xff1a;“我永远不做手机&#xff0c;谁再敢提做手机就给…...

es 倒排索引

es 倒排索引TRee 倒排索引树&#xff08;TRee&#xff09;通常指的是Elasticsearch中用于支持高速搜索的一种数据结构。它是一种树状结构&#xff0c;可以通过特定的词项&#xff08;terms&#xff09;来快速定位包含这些词项的文档。 在Elasticsearch中&#xff0c;倒排索引…...

阿里云服务器公网带宽费用全解析(不同计费模式)

阿里云服务器公网带宽怎么收费&#xff1f;北京地域服务器按固定带宽计费一个月23元/M&#xff0c;按使用流量计费0.8元/GB&#xff0c;云服务器地域不同实际带宽价格也不同&#xff0c;阿里云服务器网aliyunfuwuqi.com分享不同带宽计费模式下带宽收费价格表&#xff1a; 公网…...

手机网站开发入门/益阳网络推广

第四讲 xpath 一、什么xml&#xff1f; 1、定义&#xff1a;可扩展标记性语言 2、特点&#xff1a;xml的是具有自描述结构的半结构化数据。 3、作用&#xff1a;xml主要设计宗旨是用来传输数据的。他还可以作为配置文件。 二、xml和html的区别&#xff1f; 1、语法要求不同&…...

赣榆县建设局网站/顺德搜索seo网络推广

前言 alpine 提供了非常好用的apk软件包管理工具&#xff0c;通过apk –help命令查看完整的包管理命令。更新索引 update&#xff1a;从远程镜像源中更新本地镜像源索引&#xff0c;update命令会从各个镜像源列表下载APKINDEX.tar.gz并存储到本地缓存&#xff0c;一般在/var/ca…...

wordpress 营销页面/怎样做竞价推广

福建师范大学网络与继续教育学院《计算机应用基础》期末考试A 卷姓名&#xff1a;专业&#xff1a;学号&#xff1a;学习中心&#xff1a;成绩&#xff1a;一、单项选择题(答案务必写在表格中&#xff0c;每小题1 分&#xff0c;共 30 分)12345678910CCCCBBCCAC111213141516171…...

api网站模板/资源搜索引擎

在网上看了几篇AdaBoost的介绍后&#xff0c;感觉网上介绍的都不好&#xff0c;不能够让人完全理解&#xff0c;因此就下载了一个外国人写的代码&#xff0c;总算透彻的理解了AdaBoost&#xff0c;可以向Transfer开进了&#xff0c;现在分享一下代码&#xff1a;主函数代码[pla…...

企业网站写好如何发布/专业网站推广软件

论文题目&#xff1a;Extracting Entities and Events as a Single Task Using a Transition-Based Neural Model 论文来源&#xff1a;IJCAI 2019 武汉大学, 东华大学, 西湖大学 论文链接&#xff1a;https://www.ijcai.org/Proceedings/2019/753 代码链接&#xff1a;http…...

白日梦怎么做的网站/天堂网

快速找到未知长度单链表中的中间结点 1.普通方法 首先需要遍历一下链表&#xff0c;然后得知链表长度&#xff0c;然后在重新查找中间长度的结点&#xff0c;然后进行输出结点值。算法复杂度为O(n)O(1/2n)。这里就不进行普通代码演示了。 2.加分方法 运用快慢指针的方法&#…...