跳转至

SQL 时间基准与计时口径

成熟度:provisional。本页整理历史开发文档中的计时口径与测量建议;尚未逐一核验当前各分支代码和数据库实测,不作为已经统一实施的计时契约。

  • 入库时间:2026-09-22。
  • 来源:2026-09-20《SQL优化文件清单_建议归档.csv》中的两份规范主副本。
  • 适用范围:SQL 原版与改写版的性能比较,以及历史 v3 结果解释。

来源与原文

文档 清单记录的修改日期 用途 原文
时间标准_develop.md 2026-06-04 连接、缓存、驱动、execute/fetch 的计时讨论 下载原始 Markdown 文本
v3计时与一致率说明.md 2026-03-26 五次执行取后两次均值、前 500 行一致性比较 下载原始 Markdown 文本

原文以 .md.txt 保存,便于直接阅读或下载,保留其中的残缺代码块与历史表述。本页给出适用限制,不能把原文中“当前”“已支持”理解为对今天所有分支的验证。

来源档案分别位于 sql_opt/04_开发阶段/通用开发/工具与数据处理/ 与 sql_opt/04_开发阶段/V3开发线/指标与说明/。

先确定比较的时间是什么

口径 含义 比较要求
建连耗时 连接、握手与鉴权阶段 单列记录,不能混入一方而排除另一方
客户端 execute 耗时 客户端调用 execute 到返回的时间 必须记录驱动及游标类型;可能包含传输和解码
取数耗时 显式消费结果的时间 区分全量取数、抽样、仅不向调用方返回结果
客户端完整耗时 明确起点后到结果消费完成的时间 说明是否包含建连、预热、结果排空和清理
服务端语句事件耗时 数据库记录的语句事件时长 对齐线程与语句事件;不能当作纯 CPU 计算时间

原文前半部分把“不含建连的 execute”称为纯 SQL 执行,后半部分又指出 buffered 游标会在 execute 内接收结果。这两个表述需要区分:不含建连,不等于不含客户端或网络开销。

PyMySQL 的 SSCursor 按需读取结果;它改变了执行与取数阶段的边界,不能仅凭 execute 返回就认定完整查询已经测完。关闭游标也可能继续耗尽剩余结果,必须明确记录结果消费或排空阶段。PyMySQL 游标文档

需要服务端证据时,可参考 Performance Schema 的语句事件时间;文档采用皮秒展示,换算秒为 TIMER_WAIT / 10^12。是否可采集取决于数据库版本、权限及采集配置,分布式 TDSQL 还需确认节点与汇总范围。MySQL 查询性能分析文档

历史 v3 的五次采样口径

《v3计时与一致率说明》明确记录:普通查询执行五次,第 1 次保存结果,第 2~5 次只执行;主对比字段取第 4、5 次 execute 耗时的平均值,同时保留五次明细和首次取数耗时。

exe_time = (execute_time[4] + execute_time[5]) / 2

这里的下标按第 1~5 次执行编号。该说明是历史 v3 口径,不代表所有 Skill 或驱动统一采用同一策略。“只执行、不再取结果”是否真的排除了网络接收,需要结合 buffered/unbuffered 游标实现核查。

另一份原文建议“额外预热一次,再测 N 次”。这属于测量建议,与五次总执行不是同一个采样协议,不能无标记地混用。结果应记录协议版本、预热次数、计时次数、全部样本与聚合方式。

连接、缓存与公平性

原文建议同一 SQL 的测量和计划采集保持相同会话参数,不同 SQL 隔离会话状态,避免 SET、临时表、变量或事务残留。

新建连接不能等同于清空数据库缓存。应说明测试的是热缓存稳定态还是另行设计的冷启动场景;原 SQL 与改写 SQL 使用相同数据、参数、会话配置、驱动和取数策略。原文提出 AB/BA 交错执行以降低顺序偏置,落地时需记录实际顺序及环境负载。

EXPLAIN ANALYZE 的采集要与普通计时分开记录,并确认目标数据库支持;分析计划的执行开销不应直接替代普通执行耗时。对于有写入副作用的语句,重复执行与分析计划必须另行设计隔离和回滚条件。

一致性验证与时间对比一起解释

历史 v3 说明只比较保存的前 500 行,按行顺序比较 value 序列,保留列顺序但不比较列名。这只能说明该抽样和排序规则下的一致,不能推出完整结果语义等价。

  • 没有确定排序时,逐行比较可能受返回顺序影响。
  • 不应为了计时方便擅自追加 LIMIT;它可能改变返回结果及执行计划。
  • “不返回结果给调用方”不能证明底层没有接收或消费结果。
  • 性能提升应附带一致性验证范围,不能把抽样通过写成全量通过。

最小记录与待验证项

一次可复核的时间比较至少记录:SQL 与参数版本、数据库与数据版本、驱动/游标、会话参数、缓存与预热方式、执行顺序、各次 execute/fetch/完整耗时及单位、聚合规则、结果比较范围、原始证据位置。

待验证:当前分支是否仍使用五次取后两次均值;各驱动是否采用流式游标;未消费结果如何排空;Performance Schema 是否可用;分布式节点计时如何对齐。

原文还包含不完整的配置代码块及未经本次复测的驱动倍数比较,因此本页不将其补写为可运行配置或性能承诺。

关联阅读