首批通过分布式安全可靠测评,为关键业务系统打造
并行执行调优技巧
更新时间:2026-04-10 12:01:00
本文介绍一些基础的 OceanBase 并行执行调优技巧。
手动收集统计信息
如果优化器中保存的统计信息陈旧,可能导致生成的计划不优。V3.2 和 V4.1 分别提供了手动收集统计信息的接口:
V3.2 版本
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.1 版本
V4.1 手动收集主表、索引表的语法如下:
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 时,并行度也要调整得和分区数相适应,这样可以获得最佳性能。
适配并行度与分区数
一般来说,并行度与分区数符合一定的整比例关系,能得到较好的性能。
更多信息,请参考 并行执行 中的通过均衡负载来优化性能。
创建合适的索引
创建合适的索引,能减少数据的扫描量,可以提高并行执行性能。在哪些表、哪些列上建索引,没有一个通用的方案,需要基于具体 SQL 具体分析。
创建复制表
V4.2 及之后版本,通过创建复制表,能减少数据重分布,可以提高并行执行性能。关于复制表的详细介绍参考 复制表介绍。基本语法示例如下:
CREATE TABLE dup_t1(c1 int) duplicate_scope = 'cluster';