编程开发 编辑复核

SQL 查询正确性与性能检查

检查查询的结果语义、边界、索引、锁和隐私风险,输出可用执行计划验证的建议。

场景:数据分析、报表和接口查询评审输出:问题清单 + 改写草案 + EXPLAIN 计划更新于 2026-08-03

复制后替换变量

保留结构,先填真实信息,再把结果交给模型运行。

你是一名数据库查询评审员。请基于 schema、业务口径和 SQL,检查结果对不对与跑得是否安全,不要只给格式建议。

输出按 P0-P3 排序的问题:连接条件、重复行、空值、时间区间、时区、权限、全表扫描、排序/分页、锁和敏感字段暴露。每项说明证据、触发条件、影响、改写方向和验证 SQL。
最后给出需要的 EXPLAIN/EXPLAIN ANALYZE、测试数据边界和上线前后指标。没有 schema 或业务口径时不要猜列含义。

SQL:{{sql}}
Schema:{{schema}}
业务口径:{{business_definition}}
运行环境:{{environment}}

使用说明

  1. 先在脱敏副本执行 EXPLAIN 和边界样本,再考虑进入报表或接口。
  2. 结果正确性优先于速度;不能为了性能删掉去重、权限或时间边界。

适用判断

适合这些情况

  • 查询逻辑复杂,担心结果不对而不是跑得慢。
  • 涉及多表关联、聚合或子查询,边界情况容易出错。
  • 你能提供表结构和数据量级。

换个做法更好

  • 查询结果是对的,只是慢:用《SQL 查询性能评审》。
  • 查询很简单:直接跑一下比评审快。
  • 你没有表结构:模型无法判断关联字段和空值行为。

常见翻车与修正

  • 模型没注意到 LEFT JOIN 后的 WHERE 条件把外连接变成了内连接。

    这是最常见的静默错误。要求逐个 JOIN 检查过滤条件的位置,并说明放在 ON 和 WHERE 的结果差异。

  • 忽略了 NULL 参与比较和聚合时的行为。

    要求专门检查涉及 NULL 的字段:比较、COUNT、SUM 和 NOT IN 的行为,逐条说明预期。

  • 评审结论是「看起来没问题」,没有可验证的依据。

    要求给出验证查询——用小数据集能验证正确性的对照 SQL,而不是口头结论。

怎么判断输出合格

  1. 逐个检查了 JOIN 类型和过滤条件的位置。
  2. 涉及 NULL 的字段行为都单独说明了。
  3. 给出了可以实际跑的验证查询。
  4. 指出的问题都基于你提供的表结构,不是通用告诫。

使用边界

  • 不要提供生产连接信息或未经脱敏的用户数据。
  • 涉及生产写入、删除或权限变更时停止生成执行命令,转交数据库负责人。