首批通过分布式安全可靠测评,为关键业务系统打造
开启表并行后,limit 失效,没有选择最优索引
更新时间:2024-01-22 01:56
问题描述
OceanBase 数据库 V3.x 版本在 MySQL 模式下开启表并行功能,limit 算子无法下压至存储层。
完整 SQL 如下。

设置表级别并行度,SQL 中 limit 失效,导致性能崩溃。
obclient [mysql]> ALTER TABLE order_loan_record PARALLEL 4;未选择最优索引,走了一个代价极大的索引。

SQL 语句中设置索引和并行度为 1 的 HINT 提示之后的执行计划。

SQL 语句中不指定索引 HINT 提示,保留并行度为1的 HINT 提示,此时优化器默认选择执行计划。

适用版本
OceanBase 数据库 V2.x、V3.x 版本。
问题原因
OceanBase 数据库 Bug。存在多个全局索引时,全局索引带回表的场景估行存在问题,导致针对 order by limit 的查询,优化器在生成 order by 算子时因错误的代价估计直接裁掉了最佳索引(在生成 order by 算子后,分配 limit 算子有一个特殊的优化,从而再次选择最佳全局索引生成最优的执行计划。但优化器未考虑到这点,直接裁掉了最佳索引),从而无法选择到最优的全局索引上。
应急方法
使用 HINT 指定最佳索引。