大表数据高效切片:基于主键的无排序 WHERE 条件生成算法
背景
在异构数据库迁移的项目中,核对迁移前后的大表数据一致性始终是一个难题。虽然存在库内计算全表特征值的对比工具,但通常只适用于特定数据库类型(如 Oracle 与 openGauss/GaussDB),且只能判断全表是否一致,无法定位差异行。如果表数据量极大,进行一次全表扫描的开销也非常大,因此必须考虑分片算法。
传统的分片算法大多需要排序,一般基于主键排序。如果使用行号去做切片,会导致每个分片查询实际上都进行了全表扫描,性能依旧很差。自然想到需要使用索引字段作为分片条件,但复合主键如何生成 WHERE 条件,能确保各分片数据不重叠无遗漏,这个算法具有一定难度。
本文尝试通过 AI 辅助设计并实现该算法。
分片思路预览
注意该分片思路仅适用于带主键的表。
-- 构造一张百万行的表,3 个字段的复合主键
DROP TABLE T_SPLIT_MILLION;
CREATE TABLE T_SPLIT_MILLION (a NUMBER, b NUMBER, c NUMBER, pad VARCHAR2(20));
INSERT INTO T_SPLIT_MILLION SELECT MOD(ROWNUM, 3), MOD(ROWNUM, 100), ROWNUM, 'aaaaaaa' FROM DUAL CONNECT BY ROWNUM <= 1000000;
ALTER TABLE T_SPLIT_MILLION ADD CONSTRAINT PK_SPLIT_MILLION PRIMARY KEY(A, B, C) USING INDEX;
-- 统计总行数(有主键的表走 index fast full scan)
SELECT COUNT(1) FROM T_SPLIT_MILLION;
-- 根据分片数查询位点
SELECT A, B, C FROM (
SELECT A, B, C, ROW_NUMBER() OVER(ORDER BY A, B, C) rn
FROM T_SPLIT_MILLION
) WHERE rn IN(1, , , , ) rn;

