结果一致性验证与语义等价边界¶
成熟度:
provisional。依据历史开发文档整理,尚未对当前各分支实现逐项复测。四层比较通过表示该比较协议下未发现差异,不能直接标为 SQL 语义等价。
来源与适用范围¶
- 来源:2026-09-20 归档清单中的《结果一致性判断逻辑说明_develop.md》,清单修改日期 2026-06-04,入库日期 2026-09-22。
- 下载原始 Markdown 文本。原文保留历史描述和待讨论问题;下文的边界分析为本次整理结论。
- 适用对象:查询结果比较;不能据此判断写入语句的副作用等价。
四层校验分别能证明什么¶
原文记录 compare_results 将四个布尔值取 AND,生成 all_equal,同时保留 diff_reason。这些字段的证据强度不同:
| 层次 | 原文记录的检查 | 通过能说明什么 | 不能证明什么 |
|---|---|---|---|
行数 counts_equal |
优先比较 row_count,缺失时取 len(rows) |
所记录的行数相等 | 行内容相同;若回退到样本长度,更不能证明全量行数一致 |
结构 schema_equal |
比较列名集合 | 列名集合相同 | 列顺序、类型、精度和重复列名一致 |
聚合 aggregates_equal |
数值列 count/sum/min/max,文本列 distinct_count | 这些统计摘要相同 | 每个值、重复次数分布及列之间的对应关系相同 |
采样 sample_equal |
优先比较排序后前 5、后 5 行的哈希;无哈希时比较提取行的首尾样本 | 所选样本在相应序列化规则下匹配 | 中间未采样行一致,或业务要求的返回顺序一致 |
例如单列结果 [1,2,5,6] 与 [1,3,4,6] 的 count、sum、min、max 全部相同,但内容不同。这是聚合层的反例,并非声称这两个小结果会通过原文全部四层检查。多列逐列摘要相同,也不能保证同一行内各列配对关系相同。
首尾采样与前 10 行展示不是同一份证据¶
原文保存的 rows 是数据库返回顺序的前 10 行,主要用于展示。sample_hashes 则先序列化全量行、按字符串排序,再取前 5 和后 5 行的 MD5。
因此它是确定性的首尾抽样,并非随机抽样;不能从“10 行匹配”推导某个统计置信度。哈希只是样本的摘要,不会扩大覆盖范围。排序还消除了返回顺序信息,无法校验 ORDER BY 的输出契约。
缺少 sample_hashes 时,比较器会对提取到的 rows 排序取样。如果文件仅保留前 10 行,此时证据范围就退化为这些保存行,不能称为全量首尾抽样。
历史 v3 的另一份文档记录的是“前 500 行、按行顺序比较 value 序列、保留列顺序而不比较列名”。它与本页四层协议不同,应分别记录比较器版本和范围,详见时间基准与计时口径。
空结果、缺失数据与规范化的边界¶
两边都为空¶
在同一快照和参数下,两条成功执行的查询都返回空集,只能证明这个测试点返回空集。不同过滤条件可能恰好都没有命中,JOIN 或去重差异也可能没有被触发。需要补充非空、重复值、NULL、边界值及关联缺失等有区分力的测试数据。
原文 _extract_rows 在解析失败或输入缺失时也会返回 []。整理建议:将执行成功且零行,与执行失败、数据缺失、解析失败明确分开;后几种应标“无法验证”,不能作为空集一致通过。
规范化会改变比较含义¶
原文数值 sum 保留 6 位小数,文本统计将 NULL 归为空字符串,并执行去空格、转小写。这可能压缩差异。它描述的是统计层的处理,不代表样本 JSON 哈希采用同样处理,也不是适用于所有字段的业务等价规则。
整理建议:按字段明确数值精度、NULL、大小写、空白、日期时区和类型要求;输出结构应保留列位置、类型及重复列名信息。别名变化是否允许,需由消费方接口约定决定,不能为了通过比较自动忽略。
从测试结果到可采纳结论¶
| 证据状态 | 建议报告表述 |
|---|---|
| 四层协议通过 | 当前快照与参数下,摘要和样本校验通过;注明覆盖范围 |
| 全量结果比较通过 | 当前快照与参数下全量结果一致;保留重复行次数,按业务契约检查顺序 |
| 多组测试通过 | 已覆盖列明的数据与参数场景;未覆盖场景仍待验证 |
| 语义审查完成 | 记录改写规则、约束与业务前提,以及审查结论和适用范围 |
| 输入或证据缺失 | 无法验证,列出缺失项 |
全量比较也只能证明已测实例。推广到其他数据和参数,需要分析改写是否保持过滤、关联、重复行、NULL、聚合、排序分页等语义,并明确唯一性等前提。速度变快不能抵消结果错误。
每次报告至少保留 SQL/参数、数据快照、数据库与会话配置、比较器版本、执行状态、全量行数、采样范围、结构/类型规则、容差、差异及证据位置。
关联阅读¶
- 优化效果指标与统计口径:把验证结论与性能、采纳指标分开。
- 测试数据治理与稳定基线:管理环境、参数和证据。