OceanBase与TiDB优化器的基数预估准确度和连接顺序选择能力的评测
一、引言
查询优化器作为数据库查询引擎的大脑,负责生成理想的执行计划,一直以来都被认为是查询引擎中最重要最核心的部分。现代数据库系统的优化器都是基于代价的优化器(Cost-based Optimizer, CBO),使用代价模型选出最佳的执行计划。相关研究表明,提升基数预估的准确度比代价模型中的CPU权重、IO权重等参数的作用大的多。另一方面,由于多表连接负载存在着庞大的连接顺序搜索空间,为多表连接负载确定最优的连接顺序也是一项艰难的任务。因此,优化器在不同情况下的基数预估准确度和连接顺序选择的质量可作为评测优化器的两个关键要点。本文将使用自研的工具对OceanBase、TiDB的基数预估、连接顺序选择的质量以及对于复杂连接形状的处理能力做出评测和对比。
二、背景知识和实验设置
1.基数预估
基数预估的作用是预估查询执行计划中算子的输出结果集大小。作为代价模型中的重要参数,基数预估的准确度会对查询执行计划的选择造成很大的影响,确保基数预估的准确度十分重要。在OceanBase和TiDB中,均可使用Explain关键字来查看优化器选出的执行计划中所有算子的基数预估结果。比如,在OceanBase中,对负载SELECT * FROM t1,t2 WHERE t1.c2=t2.c2 AND t2.c1 > 4 的Explain结果如下所示[1],表示OceanBase选定HashJoin作为表t1和t2之间连接的物理算法,预估的连接基数大小为9801000。
`Query Plan:
=======================================
|ID|OPERATOR |NAME|EST. ROWS|COST |
---------------------------------------
|0 |HASH JOIN | |9801000 |5933109|
|1 | TABLE SCAN|t2 |10000 |6219 |
|2 | TABLE SCAN|t1 |100000 |68478 |
=======================================`
2.连接形式和连接顺序
连接形式也叫连接图(Join Graph),文献[2]中总结了可能出现的一些连接图,如图1所示,主要包括链式连接(Chain)、星型连接(Star)、树型连接(Tree)、环型连接(Cycle)、集团连接(Clique)等。其中,Cycle、Clique、Cyclic及Grid形式的连接比较复杂,在构建连接的过程中,这些形式的连接会导致新参与连接的表与已经连接的表之间存在多个连接关系,在本文中,我们称这些连接形式为复杂连接形式。
图1 连接图[2]
对于N表连接负载,存在的连接顺序有(2*N-2)!/(N-1)!个,优化器会使用一些方法(比如动态规划或贪心算法)来枚举连接顺序。由于枚举所有可能的连接顺序的代价较大,因此优化器只会枚举其子集,这可能导致优化器无法为某些多表连接负载确定最佳的连接顺序。另一方面,基数预估和连接顺序的选择是相互影响的,基数预估通过影响代价模型,从而对连接顺序的选择造成影响。同时,不同的连接顺序也会影响基数预估。同样的多表连接,不同数据库的优化器可能选出不同的连接顺序,因此,使用相同的多表连接负载测试不同数据库对其连接算子的基数预估准确度时,应固定相同的连接顺序。OceanBase和TiDB分别提供了LEADING和/*! STRAIGHT_JOIN */关键字来指定数据库以特定的连接顺序执行多表连接负载。
3.实验环境
由于查询优化器代价模型暂时无法控制,为了降低分布式环境下代价模型的影响,本文实验使用的Oceanbase和TiDB均为单机版。Oceanbase的版本为3.1.2,TiDB的版本为6.0,其中TiDB单机版包括一个TiDB组件、一个PD组件、一个TiKV组件及一个TiFlash组件。两者均在操作系统为Centos 7.9,内存为8G,CPU型号为16核 Intel Xeon Processor (Cascadelake)的机器上运行。
OceanBase的配置文件如下所示:
`global:
devname: eth0
cluster_id: 1
memory_limit: 8G
system_memory: 4G
stack_size: 512K
cpu_count: 16
cache_wash_threshold: 1G
__min_full_resource_pool_memory: 268435456
workers_per_cpu_quota: 10
schema_history_expire_time: 1d
net_thread_count: 4
major_freeze_duty_time: Disable
minor_freeze_times: 10
enable_separate_sys_clog: 0
enable_merge_by_turn: FALSE
datafile_disk_percentage: 35
syslog_level: WARN
enable_syslog_recycle: true
max_syslog_file_count: 4
appname: obtest
mysql_port: 2883
rpc_port: 2882
home_path: /root/observer
data_dir: /data
redo_dir: /redo
zone: zone0
三、OceanBase基数预估准确度和TiDB的对比
优化器在进行基数预估时会进行均匀性(uniformity)假设,即会假定除了最频繁出现的数据,其他数据都是均匀分布的[3],这种假设会导致基数预估在具有倾斜分布的数据中的不准确,从而对执行计划的选择造成影响。传统的基数预估方法有直方图和采样的方法,无法对多表连接算子的基数做出准确的预估。
为了测试OceanBase和TiDB在不同情况下的基数预估准确度,本实验随机生成不同基数大小的单表、3表、5表链式连接负载,所有参与连接的表大小均相同,分别为10000和50000,并控制过滤谓词涉及属性数据的倾斜度分别为均匀分布、倾斜度为1的ZipFian分布及倾斜度为3的ZipFian分布,以评测OceanBase和TiDB这些场景下的基数预估情况,获得的基数预估结果包括Analyze Table之前的结果、Analyze Table(OceanBase对应的命令为Alter System Major Freeze)之后的结果以及Analyze Table之后多次Explain的结果(Explain 5次)。每个测试场景均生成10个负载。不同的优化器可能对相同的多表连接负载选定不同的连接顺序,为了消除这种影响,本实验使用相同的负载进行测试时固定其连接顺序为其对应的SQL形式中From关键字后罗列的表顺序。
下列表展示了单表过滤算子在不同表大小及数据倾斜度下的基数预估情况。
单表过滤算子,表大小10000,数据为均匀分布
表大小10000,均匀分布 | 真实基数 | TiDB Analyze Table前 | OceanBase Major Freeze前 | TiDB Analyze Table后首次Explain | TiDB Analyze Table后多次Explain | OceanBase Major Freeze后首次Explain | OceanBase Major Freeze后多次Explain |
---|---|---|---|---|---|---|---|
Q1 | 4609 | 3323.33 | 3331.0 | 3323.33 | 4608.21 | 3334.0 | 3334.0 |
Q2 | 2914 | 3323.33 | 3331.0 | 3323.33 | 2914.34 | 3334.0 | 3334.0 |
Q3 | 4970 | 3333.33 | 3331.0 | 3333.33 | 4970.75 | 3334.0 | 3334.0 |
Q4 | 5637 | 3333.33 | 3331.0 | 3333.33 | 5637.41 | 3334.0 | 3334.0 |
Q5 | 3692 | 3333.33 | 3331.0 | 3333.33 | 3333.33 | 3334.0 | 3334.0 |
Q6 | 6570 | 3333.33 | 3331.0 | 3333.33 | 3333.33 | 3334.0 | 3334.0 |
Q7 | 9065 | 3333.33 | 3331.0 | 3333.33 | 9065.74 | 3334.0 | 3334.0 |
Q8 | 2126 | 3323.33 | 3331.0 | 3323.33 | 2126.22 | 3334.0 | 3334.0 |
Q9 | 2727 | 3323.33 | 3331.0 | 3323.33 | 2727.81 | 3334.0 | 3334.0 |
Q10 | 6327 | 3333.33 | 3331.0 | 3333.33 | 6326.08 | 3334.0 | 3334.0 |
单表过滤算子,表大小10000,数据倾斜度为1
表大小10000,倾斜度1 | 真实基数 | TiDB Analyze Table前 | OceanBase Major Freeze前 | TiDB Analyze Table后首次Explain | TiDB Analyze Table后多次Explain | OceanBase Major Freeze后首次Explain | OceanBase Major Freeze后多次Explain |
---|---|---|---|---|---|---|---|
Q1 | 1095 | 3333.33 | 3327.0 | 3333.33 | 1095.0 | 3334.0 | 3334.0 |
Q2 | 1313 | 3333.33 | 3327.0 | 3333.33 | 3333.33 | 3334.0 | 3334.0 |
Q3 | 7018 | 3323.33 | 3327.0 | 3323.33 | 3323.33 | 3334.0 | 3334.0 |
Q4 | 75 | 3333.33 | 3327.0 | 3333.33 | 75.34 | 3334.0 | 3334.0 |
Q5 | 9019 | 3323.33 | 3327.0 | 3323.33 | 9019.0 | 3334.0 | 3334.0 |
Q6 | 921 | 3333.33 | 3327.0 | 3333.33 | 920.06 | 3334.0 | 3334.0 |
Q7 | 6832 | 3323.33 | 3327.0 | 3323.33 | 6833.85 | 3334.0 | 3334.0 |
Q8 | 660 | 3333.33 | 3327.0 | 3333.33 | 3333.33 | 3334.0 | 3334.0 |
Q9 | 9816 | 3323.33 | 3327.0 | 3323.33 | 3323.33 | 3334.0 | 3334.0 |
Q10 | 1227 | 3333.33 | 3327.0 | 3333.33 | 1225.15 | 3334.0 | 3334.0 |
单表过滤算子,表大小10000,数据倾斜度为3
表大小10000,倾斜度3 | 真实基数 | TiDB Analyze Table前 | OceanBase Major Freeze前 | TiDB Analyze Table后首次Explain | TiDB Analyze Table后多次Explain | OceanBase Major Freeze后首次Explain | OceanBase Major Freeze后多次Explain |
---|---|---|---|---|---|---|---|
Q1 | 9994 | 3323.33 | 3327.0 | 3323.33 | 9994.0 | 3334.0 | 3334.0 |
Q2 | 1676 | 3333.33 | 3327.0 | 3333.33 | 1676.0 | 3334.0 | 3334.0 |
Q3 | 9997 | 3323.33 | 3327.0 | 3323.33 | 9997.0 | 3334.0 | 3334.0 |
Q4 | 21 | 3333.33 | 3327.0 | 3333.33 | 21.0 | 3334.0 | 3334.0 |
Q5 | 9999 | 3323.33 | 3327.0 | 3323.33 | 3323.33 | 3334.0 | 3334.0 |
Q6 | 8324 | 3323.33 | 3327.0 | 3323.33 | 3323.33 | 3334.0 | 3334.0 |
Q7 | 9949 | 3323.33 | 3327.0 | 3323.33 | 9949.0 | 3334.0 | 3334.0 |
Q8 | 9990 | 3323.33 | 3327.0 | 3323.33 | 9990.0 | 3334.0 | 3334.0 |
Q9 | 26 | 3333.33 | 3327.0 | 3333.33 | 26.0 | 3334.0 | 3334.0 |
Q10 | 9979 | 3323.33 | 3327.0 | 3323.33 | 9979.0 | 3334.0 | 3334.0 |
单表过滤算子,表大小50000,数据为均匀分布
表大小50000,均匀分布 | 真实基数 | TiDB Analyze Table前 | OceanBase Major Freeze前 | TiDB Analyze Table后首次Explain | TiDB Analyze Table后多次Explain | OceanBase Major Freeze后首次Explain | OceanBase Major Freeze后多次Explain |
---|---|---|---|---|---|---|---|
Q1 | 7008 | 16616.67 | 16634.0 | 16616.67 | 7007.86 | 16667.0 | 16667.0 |
Q2 | 6499 | 16666.67 | 16634.0 | 16666.67 | 6499.88 | 16667.0 | 16667.0 |
Q3 | 17387 | 16616.67 | 16634.0 | 16616.67 | 17387.83 | 16667.0 | 16667.0 |
Q4 | 1567 | 16666.67 | 16634.0 | 16666.67 | 16666.67 | 16667.0 | 16667.0 |
Q5 | 5445 | 16666.67 | 16634.0 | 16666.67 | 16666.67 | 16667.0 | 16667.0 |
Q6 | 41096 | 16666.67 | 16634.0 | 16666.67 | 41095.27 | 16667.0 | 16667.0 |
Q7 | 38328 | 16666.67 | 16634.0 | 16666.67 | 38328.33 | 16667.0 | 16667.0 |
Q8 | 25931 | 16616.67 | 16634.0 | 16616.67 | 25931.06 | 16667.0 | 16667.0 |
Q9 | 32516 | 16616.67 | 16634.0 | 16616.67 | 32516.54 | 16667.0 | 16667.0 |
Q10 | 18108 | 16616.67 | 16634.0 | 16616.67 | 16616.67 | 16667.0 | 16667.0 |
单表过滤算子,表大小50000,数据倾斜度为1
表大小50000,倾斜度1 | 真实基数 | TiDB Analyze Table前 | OceanBase Major Freeze前 | TiDB Analyze Table后首次Explain | TiDB Analyze Table后多次Explain | OceanBase Major Freeze后首次Explain | OceanBase Major Freeze后多次Explain |
---|---|---|---|---|---|---|---|
Q1 | 33948 | 16616.67 | 16627.0 | 16616.67 | 33948.0 | 16667.0 | 16667.0 |
Q2 | 7752 | 16666.67 | 16627.0 | 16666.67 | 7742.74 | 16667.0 | 16667.0 |
Q3 | 44944 | 16616.67 | 16627.0 | 16616.67 | 44953.26 | 16667.0 | 16667.0 |
Q4 | 49307 | 16616.67 | 16627.0 | 16616.67 | 16616.67 | 16667.0 | 16667.0 |
Q5 | 147 | 16666.67 | 16627.0 | 16666.67 | 16666.67 | 16667.0 | 16667.0 |
Q6 | 2948 | 16666.67 | 16627.0 | 16666.67 | 2939.95 | 16667.0 | 16667.0 |
Q7 | 1098 | 16666.67 | 16627.0 | 16666.67 | 1099.86 | 16667.0 | 16667.0 |
Q8 | 6932 | 16666.67 | 16627.0 | 16666.67 | 6922.74 | 16667.0 | 16667.0 |
Q9 | 49720 | 16616.67 | 16627.0 | 16616.67 | 49719.96 | 16667.0 | 16667.0 |
Q10 | 6201 | 16666.67 | 16627.0 | 16666.67 | 16666.67 | 16667.0 | 16667.0 |
单表过滤算子,表大小50000,数据倾斜度为3
表大小50000,倾斜度3 | 真实基数 | TiDB Analyze Table前 | OceanBase Major Freeze前 | TiDB Analyze Table后首次Explain | TiDB Analyze Table后多次Explain | OceanBase Major Freeze后首次Explain | OceanBase Major Freeze后多次Explain |
---|---|---|---|---|---|---|---|
Q1 | 36 | 16666.67 | 16626.0 | 16666.67 | 36.0 | 16667.0 | 16667.0 |
Q2 | 49992 | 16616.67 | 16626.0 | 16616.67 | 49992.0 | 16667.0 | 16667.0 |
Q3 | 19 | 16666.67 | 16626.0 | 16666.67 | 19.0 | 16667.0 | 16667.0 |
Q4 | 40 | 16666.67 | 16626.0 | 16666.67 | 40.0 | 16667.0 | 16667.0 |
Q5 | 49823 | 16616.67 | 16626.0 | 16616.67 | 16616.67 | 16667.0 | 16667.0 |
Q6 | 177 | 16666.67 | 16626.0 | 16666.67 | 16666.67 | 16667.0 | 16667.0 |
Q7 | 146 | 16666.67 | 16626.0 | 16666.67 | 146.0 | 16667.0 | 16667.0 |
Q8 | 478 | 16666.67 | 16626.0 | 16666.67 | 478.0 | 16667.0 | 16667.0 |
Q9 | 45 | 16666.67 | 16626.0 | 16666.67 | 45.0 | 16667.0 | 16667.0 |
Q10 | 49781 | 16616.67 | 16626.0 | 16616.67 | 49781.0 | 16667.0 | 16667.0 |
从以上单表过滤算子的基数预估情况可以看出,不管有没有Analyze Table获得统计信息,OceanBase和TiDB对于单表过滤算子的基数预估结果比较固定,与表的大小有关,会随着表大小的成比例增大。有趣的是,TiDB在多次使用Explain获取基数预估结果的过程中,其基数预估的准确度会越来越高。
下列表展示了3表连接算子在不同表大小及数据倾斜度下的基数预估准确度。
3表连接,表大小均为10000,过滤谓词涉及属性的数据为均匀分布
表大小10000,均匀分布 | 真实基数 | TiDB Analyze Table前 | OceanBase Major Freeze前 | TiDB Analyze Table后首次Explain | TiDB Analyze Table后多次Explain | OceanBase Major Freeze后首次Explain | OceanBase Major Freeze后多次Explain |
---|---|---|---|---|---|---|---|
Q1 | 272 | 5177.13 | 3263.0 | 3320.01 | 621.58 | 3334.0 | 3334.0 |
Q2 | 1394 | 5187.52 | 3264.0 | 3320.01 | 2094.13 | 3334.0 | 3334.0 |
Q3 | 3250 | 5182.33 | 3262.0 | 3320.01 | 5948.56 | 3334.0 | 3334.0 |
Q4 | 1185 | 5182.33 | 3260.0 | 3320.01 | 3320.01 | 3334.0 | 3334.0 |
Q5 | 724 | 5177.13 | 3263.0 | 3323.33 | 3323.33 | 3334.0 | 3334.0 |
Q6 | 5 | 5187.52 | 3261.0 | 3323.33 | 23.08 | 3334.0 | 3334.0 |
Q7 | 274 | 5192.71 | 3262.0 | 3323.33 | 2908.19 | 3334.0 | 3334.0 |
Q8 | 313 | 5187.52 | 3263.0 | 3323.33 | 794.45 | 3334.0 | 3334.0 |
Q9 | 127 | 5187.52 | 3263.0 | 3323.33 | 400.0 | 3334.0 | 3334.0 |
Q10 | 1542 | 5182.33 | 3263.0 | 3323.33 | 3323.33 | 3334.0 | 3334.0 |
3表连接,表大小均为10000,过滤谓词涉及属性的数据倾斜度为1
表大小10000,倾斜度1 | 真实基数 | TiDB Analyze Table前 | OceanBase Major Freeze前 | TiDB Analyze Table后首次Explain | TiDB Analyze Table后多次Explain | OceanBase Major Freeze后首次Explain | OceanBase Major Freeze后多次Explain |
---|---|---|---|---|---|---|---|
Q1 | 164 | 5197.92 | 3266.0 | 3330.0 | 3330.0 | 3334.0 | 3334.0 |
Q2 | 9 | 5203.12 | 3264.0 | 3330.0 | 9.85 | 3334.0 | 3334.0 |
Q3 | 116 | 5192.71 | 3266.0 | 3323.33 | 466.0 | 3334.0 | 3334.0 |
Q4 | 12 | 5187.52 | 3266.0 | 3323.33 | 254.0 | 3334.0 | 3334.0 |
Q5 | 13 | 5177.13 | 3264.0 | 3320.01 | 3031.15 | 3334.0 | 3334.0 |
Q6 | 1597 | 5182.33 | 3264.0 | 3323.33 | 3323.33 | 3334.0 | 3334.0 |
Q7 | 86 | 5187.52 | 3264.0 | 3323.33 | 3323.33 | 3334.0 | 3334.0 |
Q8 | 785 | 5187.52 | 3264.0 | 3323.33 | 3336.0 | 3334.0 | 3334.0 |
Q9 | 2853 | 5166.78 | 3266.0 | 3323.33 | 4664.0 | 3334.0 | 3334.0 |
Q10 | 5898 | 5187.52 | 3264.0 | 3323.33 | 5899.85 | 3334.0 | 3334.0 |
3表连接,表大小均为10000,过滤谓词涉及属性的数据倾斜度为3
表大小10000,倾斜度3 | 真实基数 | TiDB Analyze Table前 | OceanBase Major Freeze前 | TiDB Analyze Table后首次Explain | TiDB Analyze Table后多次Explain | OceanBase Major Freeze后首次Explain | OceanBase Major Freeze后多次Explain |
---|---|---|---|---|---|---|---|
Q1 | 8324 | 5182.33 | 3265.0 | 3316.69 | 8324.0 | 3334.0 | 3334.0 |
Q2 | 1041 | 5187.52 | 3263.0 | 3320.01 | 1676.0 | 3334.0 | 3334.0 |
Q3 | 438 | 5192.71 | 3263.0 | 3323.33 | 635.0 | 3334.0 | 3334.0 |
Q4 | 10 | 5182.33 | 3263.0 | 3320.01 | 3320.01 | 3334.0 | 3334.0 |
Q5 | 9365 | 5187.52 | 3263.0 | 3323.33 | 3323.33 | 3334.0 | 3334.0 |
Q6 | 308 | 5187.52 | 3261.0 | 3323.33 | 635.0 | 3334.0 | 3334.0 |
Q7 | 6 | 5187.5 | 3265.0 | 3323.33 | 14.0 | 3334.0 | 3334.0 |
Q8 | 70 | 5182.33 | 3265.0 | 3323.33 | 91.0 | 3334.0 | 3334.0 |
Q9 | 8 | 5197.92 | 3261.0 | 3333.33 | 8.0 | 3334.0 | 3334.0 |
Q10 | 18 | 5182.33 | 3265.0 | 3323.33 | 3323.33 | 3334.0 | 3334.0 |
3表连接,表大小均为50000,过滤谓词涉及属性的数据为均匀分布
表大小50000,均匀分布 | 真实基数 | TiDB Analyze Table前 | OceanBase Major Freeze前 | TiDB Analyze Table后首次Explain | TiDB Analyze Table后多次Explain | OceanBase Major Freeze后首次Explain | OceanBase Major Freeze后多次Explain |
---|---|---|---|---|---|---|---|
Q1 | 18758 | 25885.65 | 16335.0 | 16600.05 | 22765.17 | 16667.0 | 16667.0 |
Q2 | 4706 | 25963.54 | 16337.0 | 16616.67 | 19569.44 | 16667.0 | 16667.0 |
Q3 | 170 | 25937.58 | 16335.0 | 16616.67 | 170.46 | 16667.0 | 16667.0 |
Q4 | 1632 | 25963.54 | 16335.0 | 16616.67 | 1734.37 | 16667.0 | 16667.0 |
Q5 | 803 | 25989.61 | 16334.0 | 16650.0 | 16650.0 | 16667.0 | 16667.0 |
Q6 | 5979 | 25937.58 | 16335.0 | 16616.67 | 16616.67 | 16667.0 | 16667.0 |
Q7 | 3236 | 25963.54 | 16334.0 | 16616.67 | 22334.68 | 16667.0 | 16667.0 |
Q8 | 14231 | 25937.58 | 16334.0 | 16616.67 | 17668.03 | 16667.0 | 16667.0 |
Q9 | 5402 | 26015.62 | 16335.0 | 16666.67 | 18521.98 | 16667.0 | 16667.0 |
Q10 | 3292 | 25963.54 | 16335.0 | 16616.67 | 16069.18 | 16667.0 | 16667.0 |
3表连接,表大小均为50000,过滤谓词涉及属性的数据倾斜度为1
表大小50000,倾斜度1 | 真实基数 | TiDB Analyze Table前 | OceanBase Major Freeze前 | TiDB Analyze Table后首次Explain | TiDB Analyze Table后多次Explain | OceanBase Major Freeze后首次Explain | OceanBase Major Freeze后多次Explain |
---|---|---|---|---|---|---|---|
Q1 | 43381 | 16600.05 | 16335.0 | 43390.26 | 43390.26 | 16667.0 | 16667.0 |
Q2 | 9990 | 16600.05 | 16335.0 | 14423.0 | 14423.0 | 16667.0 | 16667.0 |
Q3 | 1429 | 16600.05 | 16335.0 | 13020.0 | 13020.0 | 16667.0 | 16667.0 |
Q4 | 278 | 16616.67 | 16335.0 | 7390.74 | 7390.74 | 16667.0 | 16667.0 |
Q5 | 20729 | 16600.05 | 16335.0 | 20729.0 | 20729.0 | 16667.0 | 16667.0 |
Q6 | 3249 | 16616.67 | 16335.0 | 10002.74 | 10002.74 | 16667.0 | 16667.0 |
Q7 | 1290 | 16600.05 | 16335.0 | 1463.64 | 1463.64 | 16667.0 | 16667.0 |
Q8 | 7169 | 16616.67 | 16335.0 | 12225.0 | 12225.0 | 16667.0 | 16667.0 |
Q9 | 385 | 16616.67 | 16336.0 | 19938.74 | 19938.74 | 16667.0 | 16667.0 |
Q10 | 1041 | 16616.67 | 16335.0 | 2848.74 | 2848.74 | 16667.0 | 16667.0 |
3表连接,表大小均为50000,过滤谓词涉及属性的数据倾斜度为3
表大小50000,倾斜度3 | 真实基数 | TiDB Analyze Table前 | OceanBase Major Freeze前 | TiDB Analyze Table后首次Explain | TiDB Analyze Table后多次Explain | OceanBase Major Freeze后首次Explain | OceanBase Major Freeze后多次Explain |
---|---|---|---|---|---|---|---|
Q1 | 49329 | 16600.05 | 16305.0 | 49329.0 | 49329.0 | 16667.0 | 16667.0 |
Q2 | 196 | 16616.67 | 16305.0 | 219.0 | 219.0 | 16667.0 | 16667.0 |
Q3 | 15 | 16600.05 | 16306.0 | 103.0 | 103.0 | 16667.0 | 16667.0 |
Q4 | 74 | 16616.67 | 16305.0 | 177.0 | 177.0 | 16667.0 | 16667.0 |
Q5 | 50 | 16600.05 | 16305.0 | 51.0 | 51.0 | 16667.0 | 16667.0 |
Q6 | 12 | 16616.67 | 16305.0 | 21.0 | 21.0 | 16667.0 | 16667.0 |
Q7 | 193 | 16600.05 | 16304.0 | 671.0 | 671.0 | 16667.0 | 16667.0 |
Q8 | 49897 | 16616.67 | 16305.0 | 49897.0 | 49897.0 | 16667.0 | 16667.0 |
Q9 | 41604 | 16616.67 | 16304.0 | 41604.0 | 41604.0 | 16667.0 | 16667.0 |
Q10 | 549 | 16616.67 | 16304.0 | 671.0 | 671.0 | 16667.0 | 16667.0 |
从以上3表连接算子在不同表大小以及数据倾斜度下的基数预估情况来看,在Analyze Table之前,由于OceanBase和TiDB都没有统计信息,因此会把这列数据当成均匀分布来看,其结果较为固定,不会随着真实基数的改变而改变。然而,在Analyze Table之后,首次使用Explain获取TiDB的基数预估结果已经会随着真实基数的改变而改变,呈现高估的现象,而OceanBase的基数预估结果相比Major Freeze之前有所改变,但仍然是固定的数值。另外,TiDB的基数预估是不稳定的,在表大小50000,数据均匀分布的情况下,我们可以发现,在Analyze Table之后,首次使用Explain并不能获得随真实基数变化的预估结果。
下列表展示了5表连接算子在不同表大小及数据倾斜度下的基数预估准确度。
5表连接,表大小均为10000,过滤谓词涉及属性的数据为均匀分布
表大小10000,均匀分布 | 真实基数 | TiDB Analyze Table前 | OceanBase Major Freeze前 | TiDB Analyze Table后首次Explain | TiDB Analyze Table后多次Explain | OceanBase Major Freeze后首次Explain | OceanBase Major Freeze后多次Explain |
---|---|---|---|---|---|---|---|
Q1 | 15 | 8089.27 | 3199.0 | 3320.01 | 3320.01 | 3334.0 | 3334.0 |
Q2 | 88 | 8089.29 | 3202.0 | 3320.01 | 3320.01 | 3334.0 | 3334.0 |
Q3 | 1323 | 8081.18 | 3199.0 | 3320.01 | 3360.19 | 3334.0 | 3334.0 |
Q4 | 22 | 8089.27 | 3196.0 | 3316.69 | 1569.78 | 3334.0 | 3334.0 |
Q5 | 870 | 8105.49 | 3199.0 | 3320.01 | 870.46 | 3334.0 | 3334.0 |
Q6 | 1731 | 8097.39 | 3199.0 | 3323.33 | 5484.2 | 3334.0 | 3334.0 |
Q7 | 26 | 8105.49 | 3199.0 | 3320.01 | 3320.01 | 3334.0 | 3334.0 |
Q8 | 188 | 8097.36 | 3199.0 | 3323.33 | 3323.33 | 3334.0 | 3334.0 |
Q9 | 181 | 8065.02 | 3194.0 | 3316.69 | 980.68 | 3334.0 | 3334.0 |
Q10 | 451 | 8089.29 | 3198.0 | 3320.01 | 4432.78 | 3334.0 | 3334.0 |
5表连接,表大小均为10000,过滤谓词涉及属性的数据倾斜度为1
表大小10000,倾斜度1 | 真实基数 | TiDB Analyze Table前 | OceanBase Major Freeze前 | TiDB Analyze Table后首次Explain | TiDB Analyze Table后多次Explain | OceanBase Major Freeze后首次Explain | OceanBase Major Freeze后多次Explain |
---|---|---|---|---|---|---|---|
Q1 | 82 | 8081.18 | 3199.0 | 3320.01 | 3320.01 | 3334.0 | 3334.0 |
Q2 | 6 | 8113.61 | 3199.0 | 3323.33 | 19.89 | 3334.0 | 3334.0 |
Q3 | 10 | 8097.39 | 3195.0 | 3323.33 | 736.15 | 3334.0 | 3334.0 |
Q4 | 19 | 8105.49 | 3199.0 | 3320.01 | 3582.15 | 3334.0 | 3334.0 |
Q5 | 24 | 8105.49 | 3199.0 | 3323.33 | 2027.15 | 3334.0 | 3334.0 |
Q6 | 104 | 8065.0 | 3202.0 | 3323.33 | 3323.33 | 3334.0 | 3334.0 |
Q7 | 56 | 8073.1 | 3199.0 | 3320.01 | 3320.01 | 3334.0 | 3334.0 |
Q8 | 85 | 8081.18 | 3203.0 | 3320.01 | 3323.33 | 3334.0 | 3334.0 |
Q9 | 23 | 8089.27 | 3199.0 | 3323.33 | 109.4 | 3334.0 | 3334.0 |
Q10 | 648 | 8065.02 | 3203.0 | 3320.01 | 2567.15 | 3334.0 | 3334.0 |
5表连接,表大小均为10000,过滤谓词涉及属性的数据倾斜度为3
表大小10000,倾斜度3 | 真实基数 | TiDB Analyze Table前 | OceanBase Major Freeze前 | TiDB Analyze Table后首次Explain | TiDB Analyze Table后多次Explain | OceanBase Major Freeze后首次Explain | OceanBase Major Freeze后多次Explain |
---|---|---|---|---|---|---|---|
Q1 | 24 | 8105.47 | 3196.0 | 3323.33 | 91.0 | 3334.0 | 3334.0 |
Q2 | 16 | 8097.39 | 3196.0 | 3320.01 | 67.0 | 3334.0 | 3334.0 |
Q3 | 67 | 8089.27 | 3199.0 | 3323.33 | 197.0 | 3334.0 | 3334.0 |
Q4 | 6 | 8089.27 | 3194.0 | 3320.01 | 32.0 | 3334.0 | 3334.0 |
Q5 | 8324 | 8081.18 | 3194.0 | 3320.01 | 3320.01 | 3334.0 | 3334.0 |
Q6 | 1349 | 8105.49 | 3196.0 | 3323.33 | 3323.33 | 3334.0 | 3334.0 |
Q7 | 1041 | 8081.2 | 3197.0 | 3320.01 | 1676.0 | 3334.0 | 3334.0 |
Q8 | 308 | 8065.02 | 3199.0 | 3320.01 | 635.0 | 3334.0 | 3334.0 |
Q9 | 9 | 8081.2 | 3204.0 | 3320.01 | 26.0 | 3334.0 | 3334.0 |
Q10 | 7 | 8073.1 | 3196.0 | 3320.01 | 21.0 | 3334.0 | 3334.0 |
5表连接,表大小均为50000,过滤谓词涉及属性的数据为均匀分布
表大小50000,均匀分布 | 真实基数 | TiDB Analyze Table前 | OceanBase Major Freeze前 | TiDB Analyze Table后首次Explain | TiDB Analyze Table后多次Explain | OceanBase Major Freeze后首次Explain | OceanBase Major Freeze后多次Explain |
---|---|---|---|---|---|---|---|
Q1 | 131 | 40365.48 | 16010.0 | 16600.05 | 619.1 | 16667.0 | 16667.0 |
Q2 | 6075 | 26015.62 | 15979.0 | 16583.45 | 16583.45 | 16667.0 | 16667.0 |
Q3 | 30 | 32357.16 | 16010.0 | 16583.45 | 16583.45 | 16667.0 | 16667.0 |
Q4 | 958 | 32357.16 | 15979.0 | 16600.05 | 1643.99 | 16667.0 | 16667.0 |
Q5 | 181 | 32389.55 | 15979.0 | 1342.14 | 1342.14 | 16667.0 | 16667.0 |
Q6 | 1263 | 32389.45 | 15979.0 | 16616.67 | 16020.82 | 16667.0 | 16667.0 |
Q7 | 3621 | 25989.61 | 15979.0 | 16616.67 | 10199.24 | 16667.0 | 16667.0 |
Q8 | 630 | 25963.62 | 15979.0 | 16616.67 | 16616.67 | 16667.0 | 16667.0 |
Q9 | 482 | 32421.97 | 15979.0 | 16616.67 | 16616.67 | 16667.0 | 16667.0 |
Q10 | 2143 | 25963.54 | 16042.0 | 16616.67 | 15048.5 | 16667.0 | 16667.0 |
5表连接,表大小均为50000,过滤谓词涉及属性的数据倾斜度为1
表大小50000,倾斜度1 | 真实基数 | TiDB Analyze Table前 | OceanBase Major Freeze前 | TiDB Analyze Table后首次Explain | TiDB Analyze Table后多次Explain | OceanBase Major Freeze后首次Explain | OceanBase Major Freeze后多次Explain |
---|---|---|---|---|---|---|---|
Q1 | 6474 | 40446.45 | 15985.0 | 16583.45 | 27418.0 | 16667.0 | 16667.0 |
Q2 | 954 | 40486.82 | 15985.0 | 16616.67 | 3095.07 | 16667.0 | 16667.0 |
Q3 | 132 | 40446.33 | 15989.0 | 16600.05 | 3434.36 | 16667.0 | 16667.0 |
Q4 | 459 | 40365.48 | 15989.0 | 16600.05 | 13104.74 | 16667.0 | 16667.0 |
Q5 | 14 | 40365.48 | 16032.0 | 16600.05 | 16600.05 | 16667.0 | 16667.0 |
Q6 | 648 | 40324.99 | 15985.0 | 16616.67 | 16616.67 | 16667.0 | 16667.0 |
Q7 | 210 | 40405.88 | 16010.0 | 16600.05 | 2778.0 | 16667.0 | 16667.0 |
Q8 | 53 | 40486.94 | 16007.0 | 16616.67 | 805.02 | 16667.0 | 16667.0 |
Q9 | 416 | 40486.94 | 16010.0 | 16616.67 | 4436.74 | 16667.0 | 16667.0 |
Q10 | 29 | 40446.33 | 16010.0 | 16616.67 | 9777.0 | 16667.0 | 16667.0 |
5表连接,表大小均为50000,过滤谓词涉及属性的数据倾斜度为3
表大小50000,倾斜度3 | 真实基数 | TiDB Analyze Table前 | OceanBase Major Freeze前 | TiDB Analyze Table后首次Explain | TiDB Analyze Table后多次Explain | OceanBase Major Freeze后首次Explain | OceanBase Major Freeze后多次Explain |
---|---|---|---|---|---|---|---|
Q1 | 41604 | 16600.05 | 16010.0 | 41604.0 | 41604.0 | 16667.0 | 16667.0 |
Q2 | 180 | 16600.05 | 16010.0 | 357.0 | 357.0 | 16667.0 | 16667.0 |
Q3 | 15 | 16600.05 | 16010.0 | 103.0 | 103.0 | 16667.0 | 16667.0 |
Q4 | 8 | 16600.05 | 16017.0 | 66.0 | 66.0 | 16667.0 | 16667.0 |
Q5 | 34 | 16600.05 | 16004.0 | 122.0 | 122.0 | 16667.0 | 16667.0 |
Q6 | 5 | 16600.05 | 16010.0 | 26.0 | 26.0 | 16667.0 | 16667.0 |
Q7 | 1542 | 16616.67 | 16010.0 | 3196.0 | 3196.0 | 16667.0 | 16667.0 |
Q8 | 5200 | 16600.05 | 16010.0 | 8396.0 | 8396.0 | 16667.0 | 16667.0 |
Q9 | 333 | 16616.67 | 16010.0 | 1004.0 | 1004.0 | 16667.0 | 16667.0 |
Q10 | 10 | 16616.67 | 16017.0 | 23.0 | 23.0 | 16667.0 | 16667.0 |
从以上5表连接算子的基数预估结果,我们可以得出与3表连接中类似的现象和结论。
四、OceanBase和TiDB对于星型连接顺序选择质量的对比
星型连接在数据仓库等OLAP场景中十分常见,主要包括一个事实表和多个维度表之间进行主键-外键连接,事实表一般比维度表大。数据库对于星型连接的处理能力反应了该数据库在OLAP领域的适用度。本实验控制维度表的大小范围在[10,50],事实表的大小分别为10000,50000,100000,500000,1000000,在不同事实表大小的情况下分别随机生成50个8表星型连接查询。基于贪心的思想,优先选择连接基数小的算子先进行连接(包括笛卡尔积),对多表星型连接进行连接顺序的重排。比如在A,B,C,D,E 5表连接中,首先两个连接基数最小的表做连接,中间结果为Join_a;接着从剩下的表中选择与Join_a连接基数最小的表进行连接,重复该过程直到所有的表都参与连接。本实验以重排后的连接顺序作为基准,对OceanBase和TiDB优化器选定的连接顺序进行平均执行时间的对比。为了避免执行计划缓存的影响,本实验在OceanBase和TiDB中均设置关闭执行计划缓存。
图2展示了维度表大小不同的情况下,两种数据库经过连接顺序重排前后的执行时间对比,横坐标表示事实表大小,纵坐标表示执行时间。可以发现,两种数据库的优化器在经典的星型连接场景下,均无法选出最优的连接顺序,存在连接顺序选择策略的提升空间。同时我们还可以从本实验场景中看出,在事实表大小为100000及以下,OceanBase和TiDB在处理星型连接时的性能接近,在事实表大小为500000和1000000时,OceanBase和TiDB处理星型连接的执行时间差异略大。
图2 OceanBase和TiDB优化器选择的连接顺序和本文基于连接基数最小原则重排后的连接顺序性能对比
为了评测两种数据库优化器对于星型连接的连接顺序选择策略的可提升空间,我们使用连接顺序重排后的执行计划作为基准计划,计算两种数据库重排前的连接顺序和重排后的连接顺序的执行时间的比值,当作执行效率提升的倍数。两种数据库的优化器对于星型连接的可提升空间如图3所示,横坐标表示事实表大小,纵坐标表示执行效率提升的倍数。由本实验可知,在事实表大小为100000及以下时,TiDB优化器对于星型连接的连接顺序选择策略的可提升空间大于OceanBase;在事实表大小为500000和1000000时,两种数据库的优化器选出的执行计划的性能和本实验的基准计划的执行性能相似。另一方面,OceanBase优化器所选的执行计划和我们重排连接顺序后的基准计划相比,其可提升空间随着事实表的增多呈现降低的趋势。
由于OceanBase支持Bushy Tree,我们目前的连接顺序重排算法只能基于连接基数最小原则给出基数最优的左深树,后续可改进我们的连接顺序重排算法,使得其支持Bushy Tree,从而做出更深度的连接顺序选择质量的评测。
图3 OceanBase和TiDB优化器对于星型连接的连接顺序选择策略的可提升空间
注:本实验的所有数据和负载可通过连接获取:https://drive.google.com/drive/folders/1P53_FWfusCa3xhSSZLDCBZm1VZy52hBi?usp=sharing,包括重排前的负载和重排后的负载。
五、OceanBase和TiDB对于复杂连接形式处理能力的对比
本节首先展示OceanBase和TiDB是否全部支持图1不同的连接形式(或连接图),随机生成有意义的7种不同连接形式的负载,查看两种数据库是否可执行,结果如下表所示。
TiDB | OceanBase | |
---|---|---|
Chain Join | 支持 | 支持 |
Star Join | 支持 | 支持 |
Cycle Join | 支持 | 支持 |
Clique Join | 支持 | 支持 |
Cyclic Join | 支持 | 支持 |
Tree Join | 支持 | 支持 |
Grid Join | 支持 | 支持 |
为了评测OceanBase和TiDB处理复杂连接形式的性能,本实验设定所有表大小均为100万,分别随机生成50个4表连接、5表连接、6表连接、7表连接、8表连接和9表连接负载,将这些负载在OceanBase和TiDB分别执行并对比整体执行时间。本实验保证负载完全能产生有意义的非空结果,负载中涉及到的复杂连接方式包括Cycle Join、Cyclic Join及Clique Join,所有连接均为主键-外键连接。
图4、图5和图6展示了在本文的测试场景下,OceanBase和TiDB在Clique Join、Cycle Join及Cyclic Join情况下的执行时延(Latency),横坐标表示参与连接的表数目。
图4 OceanBase和TiDB在不同连接数目的Clique Join中的执行时间
图5 OceanBase和TiDB在不同连接数目的Cycle Join中的执行时间
图6 OceanBase和TiDB在不同连接数目的Cyclic Join中的执行时间
从图4、图5和图6中可以看出,OceanBase处理复杂连接形式负载的整体时延高于TiDB,在我们随机生成的测试场景中,OceanBase处理复杂连接形式负载的时延大部分为千级别(ms),而TiDB的时延为稳定的百级别(ms)。此外,在环型连接(Cycle Join)中,OceanBase处理8表连接和9表连接的时延达到了万级别(ms)。
六、总结
基于本文的实验,我们总结如下:
1.基数预估方面,在Analyze Table之前,OceanBase和TiDB都会默认数据为均匀分布,该种情况下的基数预估结果和真实基数无关,随着表大小成比例改变。在Analyze Table之后,TiDB的基数预估不固定,首次使用Explain获取预估结果和多次使用Explain获取结果可能不一致,而OceanBase经过Major Freeze后,其基数预估结果仍不会随真实基数的改变而改变。
2.在星型连接场景中,OceanBase和TiDB的优化器均无法选出最佳的连接顺序,其中OceanBase的优化器选择的连接顺序的质量比TiDB更接近于本文基于连接基数最小原则进行重排后的连接顺序。
3.在复杂连接形式的处理性能方面,在百万级别数据量的多表连接情况下,OceanBase的性能要低于TiDB,未来应在OLAP方面加强。
二、参考材料
[1] Explain, https://open.oceanbase.com/docs/observer-cn/V3.1.2/10000000000015437
[2] Join Order, https://db.in.tum.de/teaching/ws1415/queryopt/chapter3.pdf?lang=de
[3] Leis, Viktor, et al. “Query optimization through the looking glass, and what we found running the join order benchmark.” The VLDB Journal 27.5 (2018): 643-668.
Previous post
OceanBase性能调优
Next post
面向HTAP数据库的基准评测工具研究进展