并行执行是一个复杂的主题,需要经过一段时间的学习,才能准确把握,将并行执行的威力发挥到最大。为了让新手同学快速上手并行执行,提供本 Quick Start,适用于 3.1 及以上任意版本的 OceanBase。这里提供的参数不是最优的,但是可以避免绝大多数 bad case。
并行执行系列的内容分为以下七篇博客,本篇是最后一篇。
第一篇 | 并行执行概念 |
第二篇 | 设定并行度 |
第三篇 | 并发控制与排队 |
第四篇 | 并行执行分类 |
第五篇 | 并行执行控制参数 |
第六篇 | 并行执行诊断及调优技巧 |
第七篇 | 并行执行 PoC QuickStart |
环境初始化
在 AP 租户下设置:
/* MySQL */
set global parallel_servers_target = MIN_CPU * 20;
/* Oracle */
alter system set parallel_servers_target = MIN_CPU * 20;
统计信息搜集
3.x 版本的统计信息搜集跟合并绑定,所以在导入数据之后,需要发起一轮合并才能保证统计信息的搜集。
4.x 版本在导入数据之后,可以直接调用 DBMS_STAT 统计信息包来搜集统计信息。
HINT 设置
每条 SQL 的并行度(DOP),最大不要超过物理CPU 数量的 1.5 倍。
一般来说,如果没有多个 SQL 并发执行,单条 SQL 的并行度可以设置为 CPU 数。
例如,系统的物理CPU 数为 32,那么 HINT 就设置为 /*+ PARALLEL(32) */
性能调优
top -H
看看租户 CPU 使用情况- 单条 SQL 性能不符合预期,请联系技术支持同学使用 sql_plan_monitor 获取性能报告并进行初步判定,然后可交由 OB 的研发同学进行进一步的分析。
常见问题
- Query 查询性能不符合预期,CPU 没用满
请执行
show variables like 'parallel_servers_target
确认 target 值不小于 MIN_CPU * 20
2. PDML 性能不符合预期
请使用 explain extended 解释 PDML,确认计划走了 PDML。如果没有走 PDML,计划最底部的 Note 字段会说明原因。一般是因为被修改的表包含了 trigger、外键、local unique index 等原因。
如果出现 DISTRIBUTED INSERT,DISTRIBUTED UPDATE,DISTRIBUTED DELETE 等字样,就说明没有走 PDML。
3. PDML 超时,内部日志显示出现 -4138 OB_SNAPSHOT_DISCARDED 报错
请调大 undo_retention 参数,使其不小于 PDML 的最大执行时间。它的默认值只有 30min,一旦 PDML 执行时间超过 30min,就可能遇到这个问题,导致执行终止,重试,直到超时。
4. 业务不能做任何修改,如何让业务 SQL 并行起来?
OBProxy 允许用户在 WEB 界面上修改连接配置,开启并行。例如,在读写分离连接上,将全部 SQL 的并行度设置为 2:
OBProxy 版本 3211bp1 及以上;WEB 界面版本:2023年4月迭代,发布时间五月初。