首批通过分布式安全可靠测评,为关键业务系统打造
并行执行调优技巧
更新时间:2026-04-07 20:57:20
本文介绍 OceanBase 的基础并行执行调优方法,涵盖统计信息收集、分区策略优化、并行度配置、索引优化及复制表应用。
手动收集统计信息
若优化器统计信息过期,可能导致执行计划质量下降。不同版本的语法差异需注意:
V3.2.x 版本
V3.2 手动收集主表(索引表不支持)的语法如下:
MySQL 模式语法:
-- 先需要开启 analyze 语法支持:
ALTER SYSTEM SET enable_sql_extension = true;
-- 收集用户 TEST 的表 T1 的统计信息,所有列的桶个数设定为 auto 策略:
ANALYZE TABLE T1 COMPUTE STATISTICS FOR ALL COLUMNS SIZE AUTO;
Oracle 模式语法:
-- 收集用户 TEST 的表 T1 的全局级别的统计信息,所有列的桶个数设定为 auto 策略:
CALL dbms_stats.gather_table_stats('TEST', 'T1', granularity=>'GLOBAL', method_opt=>'FOR ALL COLUMNS SIZE AUTO');
-- 或使用 analyze 语法:
-- 收集用户 TEST 的表 T1 的统计信息,所有列的桶个数设定为 auto 策略:
ANALYZE TABLE T1 COMPUTE STATISTICS FOR ALL COLUMNS SIZE AUTO;
V4.x 版本
支持主表和索引表的统计信息收集:
MySQL 模式语法:
-- 收集用户 TEST 的表 T1 的全局级别的统计信息,所有列的桶个数设定为 auto 策略:
CALL dbms_stats.gather_table_stats('TEST', 'T1', granularity=>'GLOBAL', method_opt=>'FOR ALL COLUMNS SIZE AUTO');
-- 收集用户 TEST 的表 T1 的索引 IDX 的索引统计信息,并行度4(IDX 不唯一,需指定表名称):
CALL dbms_stats.gather_index_stats('TEST', 'IDX', degree=>4, tabname=>'T1');
Oracle 模式语法:
-- 收集用户 TEST 的表 T1 的全局级别的统计信息,所有列的桶个数设定为 auto 策略:
CALL dbms_stats.gather_table_stats('TEST', 'T1', granularity=>'GLOBAL', method_opt=>'FOR ALL COLUMNS SIZE AUTO');
-- 收集用户 TEST 的索引 IDX 的索引统计信息,并行度4(IDX 唯一,无需指定表名称):
CALL dbms_stats.gather_index_stats('TEST', 'IDX', degree=>4);
使用 Partition Wise Join 修改分区方式
在 POC 场景中,如果有大表 JOIN,并且在业务允许的前提下,可以让大表使用相同的分区方式,并且将它们绑定到同一个表组上,这样可以实现性能最佳的 partition wise join。
使用 partition wise join 时,并行度也要调整得和分区数相适应,这样可以获得最佳性能。
适配并行度与分区数
一般来说,并行度与分区数符合一定的整比例关系(如分区数为 8,则并行度设为 4、8、16 等),能得到较好的性能。
更多信息,请参考 并行执行 中的通过均衡负载来优化性能。
创建合适的索引
创建合适的索引,能减少数据的扫描量,可以提高并行执行性能。在哪些表、哪些列上建索引,没有一个通用的方案,需要基于具体 SQL 具体分析。
创建复制表(V4.2+ 版本)
V4.2 及之后版本,通过创建复制表,能减少数据重分布,可以提高并行执行性能。
关于复制表的详细介绍参考 复制表介绍、复制表(MySQL 模式)和复制表(Oracle 模式)。