sqlserver对比两个数据库的表的方法(哈希)
|
maoxiaoming
2025年9月4日 14:38
本文热度 92
|
代码对“单张表”做数据一致性判断的 核心逻辑 只有 3 步,全在下面 6 行里:
'1. 行数
cntPub = conn.execute("select count(*) from [表名]")(0)
cntSub = conn.execute("select count(*) from [表名]")(0)
'2. 整表哈希
hashPub = conn.execute("select checksum_agg(binary_checksum(*)) from [表名]")(0)
hashSub = conn.execute("select checksum_agg(binary_checksum(*)) from [表名]")(0)
'3. 一致性判断
一致 = (cntPub = cntSub) And (hashPub = hashSub)
逐句拆解
语句 | 作用 | 备注 |
---|
count(*) | 拿到 当前表的总行数 | 行数不同 → 肯定不一致 |
binary_checksum(*) | 对 每一行所有列 做二进制校验和(行级指纹) | 即使行数相同,内容不同也会得到不同值 |
checksum_agg(...) | 把整表所有行的指纹再 聚合 成一个 32 位整数 | 整张表的“指纹” |
cntPub = cntSub | 行数相同 | 第一层过滤 |
hashPub = hashSub | 聚合校验和相同 | 第二层过滤 |
同时满足 | 认为 数据完全一致 | 速度快、无遗漏 |
为什么用 checksum_agg
而不是逐行遍历?
最终判定规则
订阅库 缺表 → 直接差异。
行数 不同 → 差异。
行数相同但哈希 不同 → 差异。
行数 & 哈希 都相同 → 视为数据完全一致
该文章在 2025/9/4 14:38:05 编辑过