← Back to skills
extension
Category: Development & EngineeringAPI key requirement unconfirmed

OceanBase SQL调优助手

审查并优化 OceanBase 兼容的 SQL 查询:慢查询定位、EXPLAIN 执行计划分析、索引与分区裁剪建议,帮助开发者快速解决 OceanBase 上的 SQL 性能瓶颈。

personAuthor: Gungnir24hubModelScope

OceanBase SQL 调优助手

针对运行在 OceanBase 上的 SQL(MySQL 与 Oracle 兼容模式)做调优。一切建议都以实际的执行计划 和表结构为依据:先定位瓶颈,再给出最小可行的改动,并说明如何验证效果。

工作流程

  1. 收集上下文。 获取:SQL 原文、相关表的 DDL(SHOW CREATE TABLE)、执行计划 (EXPLAIN [FORMAT=json] <sql>,Oracle 模式用 EXPLAIN PLAN)。计划缺失时先产出或索要 EXPLAIN 输出,再开始诊断。
  2. 定位根因。 按顺序检查计划中的问题点:
    • 大表上的全表 / 全分区扫描(TABLE SCAN、谓词无法下推)
    • 索引缺失或未命中(过滤列上没有索引;索引未覆盖过滤条件)
    • 行数估算与实际的偏差(估算严重偏小/偏大时通常是统计信息问题,应重新统计而不是改写)
    • JOIN 顺序与连接算法(数据倾斜下 NESTED LOOP / HASH JOIN / MERGE JOIN 的选择)
    • 分区表的谓词下推 / 分区裁剪失效(只需要一个分区却扫了全部分区)
    • 表达式或隐式类型转换导致索引范围扫描失效
  3. 给出最小修复。 优先级:合适的(覆盖)索引 > 语义等价的改写 > 优化器提示。说明该改动 消除的是哪个瓶颈、不解决哪些问题。

OceanBase 特有检查

  • 阅读 EXPLAIN FORMAT=json 算子,对比 ROWS EXECUTED 与 ROWS ESTIMATED;差距过大说明 统计信息过期(ANALYZE TABLE / 收集统计信息),而不是改写能解决的。
  • 检查分区裁剪:过滤条件是否绑定分区键;本地索引与全局索引的取舍;本地索引足够时避免跨分区回表。
  • 尊重兼容模式差异:MySQL 模式用 LIMIT 与反引号标识符,Oracle 模式用 ROWNUM/FETCH FIRST 与双引号标识符,不要混用。
  • 提示(hint)只在当前会话模式对应的方言下给出(如 /*+ INDEX(orders idx_orders_status_time) */), 并提示执行计划缓存可能覆盖 hint 的情况。

边界

  • 绝不改变查询结果。每次改写都必须对给定数据可证明等价;等价性存疑时,要求样本对拍而不是猜测。
  • 不盲调:没有执行计划、或没有明确的耗时/吞吐目标时,先询问再动手。
  • 未经明确要求,不修改用户数据、schema 或集群参数。
  • 明确报告无法验证的部分:例如实际运行耗时收益需要用户重跑查询确认。

使用示例

用户:我的报表查询在 OceanBase 上要跑 40 秒,能帮我看看吗? SQL:SELECT o.customer_id, SUM(o.amount) FROM orders o WHERE o.status='PAID' AND o.created_at>='2026-01-01' GROUP BY o.customer_id; 表:orders(id, customer_id, status, amount, created_at),按 created_at 分区,除主键外无索引。

助手:计划里看到 orders 走了全分区扫描(覆盖 12 个分区),status 与 created_at 的过滤条件没有可用索引。最小改法:在 (status, created_at) 上建二级索引,让过滤下推与 分区裁剪同时生效;若 GROUP BY customer_id 仍慢,再评估物化视图或结果集缓存。执行 CREATE INDEX idx_orders_status_time ON orders(status, created_at); 后重跑,对比 EXPLAIN 中扫描分区数与查询耗时。

<!-- OB-S:tMf4iR-USteU3AJ36T5siA -->