跳到主要内容

最佳实践:SQL 性能优化

OpenInsight 可以让 Agent 把“SQL 为什么慢”落到任务实例、执行日志和执行计划,再把异常算子映射回任务 SQL,按收益优先级给出可执行的改写建议。

对话一:为什么执行这么慢

SQL 性能诊断结论示例

问题: 给一个任务实例链接,问“为什么执行这么慢”。

Agent 思路:

  • 确认当前 project,再把 URL 转成可查询的任务实例 ID。
  • 拆分日志:调度等待、主 SQL、收尾(swap / metadata / count / cache)。
  • 主 SQL 占绝大多数时间时,继续看执行计划异常算子。
  • 用证据排除不成立原因,例如锁等待为 0ms、收尾只有秒级。
  • 结论落到具体根因范围,例如“全量重刷 + Broadcast Hash Join spill + 落表写入反压”。
openinsight current
openinsight location 'https://example.com/#/task/instance/<instance-id>'
openinsight taskrun log --taskrun-id <taskrun-id> --line 300
openinsight taskrun diagnose <taskrun-id> --format table

对话二:Join 方案应该怎么改

SQL Join 改写示例 SQL 优化关键点

问题: 优化 Join 方案,任务 SQL 应该怎么改。

Agent 思路:

  • 定位导致 Join 变重的具体写法,而不是泛泛说“优化 Join”。
  • 识别高风险模式:Join 条件里的 round() / 类型转换、弱键匹配、未去重右表、可改成 INNER JOINLEFT JOIN
  • 按最小改动优先给建议:稳定 Join key、补充业务键、右表去重裁剪、过滤前移。
-- 慢写法
on round(f.idvisit::double, 2) = round(d.idvisit::double, 2)

-- 改写方向:提前生成稳定 key,右表去重后 INNER JOIN
with f as (
select cast(idvisit as bigint) as idvisit_key, cast(idsite as bigint) as idsite_key, ...
from event_table
where cast(idvisit as bigint) is not null
),
d as (
select * from (
select
cast(idvisit as bigint) as idvisit_key,
cast(idsite as bigint) as idsite_key,
...,
row_number() over (
partition by cast(idvisit as bigint), cast(idsite as bigint)
order by visit_last_action_time asc
) as rn
from visit_table
where cast(idvisit as bigint) is not null
) t
where rn = 1
)
select ...
from f
inner join d
on f.idvisit_key = d.idvisit_key
and f.idsite_key = d.idsite_key

常见异常场景:Starrocks

异常算子判断方向
SPILLABLE_HASH_JOIN_PROBEHash Join 落盘;检查 Join key、输入行数、Broadcast 大表、右表去重/裁剪。
OLAP_TABLE_SINK落表写入慢;检查写入行数、分桶、反压和目标表结构。
OLAP_SCAN扫描慢或小文件过多;检查扫描行数/字节数、Tablet 数量。
PROJECT表达式计算慢;检查重复 cast、复杂 case when、字符串/时间转换。
SORT / TOPN / ANALYTIC排序或窗口压力;检查无收益全局排序或高基数字段排序。
openinsight taskrun diagnose <taskrun-id> --format json \
| jq 'map({
query_id,
total,
summary: (.profile_plan | fromjson | .summary),
operators: (
(.profile_plan | fromjson | .operators // [])
| map(select(.anomaly == true) | {
name, type, executionTimeMs, outputRows, metrics
})
)
})'

适用场景

  • 排查任务实例为什么慢。
  • 把执行计划异常映射回任务 SQL。
  • 给出按收益优先级排序的 SQL 改写清单。
  • 排除调度排队、锁等待、元数据收尾等非 SQL 根因。