[英]Delta Detection in Oracle table with 2 billion records using composite key
第 1 天的初始负载
ID | 钥匙 | fkid |
---|---|---|
1个 | 0 | 100 |
1个 | 1个 | 200 |
2个 | 0 | 300 |
第 2 天加载
ID | 钥匙 | fkid |
---|---|---|
1个 | 0 | 100 |
1个 | 1个 | 200 |
2个 | 0 | 300 |
3个 | 1个 | 400 |
4个 | 0 | 500 |
需要查找第 2 天加载的增量记录
ID | 钥匙 | 地址 |
---|---|---|
3个 | 1个 | 400 |
4个 | 0 | 500 |
问题陈述需要在最短时间内找到增量记录,并说明以下事实 1:我最初必须从表中处理大约 20 亿条记录,如下所述 2:还需要在最短时间内找到增量,以便我可以快速处理
问题: 1:识别 delta 是否是一个耗时的过程,尤其是在生产停机期间? 2:识别表中具有 3 个数字列的增量需要多长时间,其中 id 和键 forms 是一个复合键。
尝试过的解决方案:1:在 case nvl 条件下使用完全连接和提取增量,但看起来成本很高。
nvl(node1.id, node2.id) id,
nvl(node1.key, node2.key) key,
nvl(node1.fkid, node2.fkid) fkid
FROM
TABLE_DAY_1 node1
FULL JOIN TABLE_DAY_2 node2 ON node2.id = node1.id
WHERE
node2.id IS NULL
OR node1.id IS NULL;```
您需要两个单独的语句来处理此问题,一个用于检测新行和更改的行,另一个用于检测已删除的行。
虽然写起来很麻烦,但最快的比较是逐个字段进行比较,因此:
SELECT /*+ parallel(8) full(node1) full(node2) USE_HASH(node1 node) */ *
FROM table_day_1 node1,
table_day_2 node2
WHERE node1.id = node2.id(+)
AND (node2.id IS NULL -- new rows
OR node1.col1 <> node2.col2 -- changed val on non-nullable col
OR NVL(node1.col3,' ') <> NVL(node2.col3,' ') -- changed val on nullable string
OR NVL(node1.col4,-1) <> NVL(node2.col4,-1) -- changed val on nullable numeric, etc..
)
然后对于删除的行:
SELECT /*+ parallel(8) full(node1) full(node2) USE_HASH(node1 node) */ node2.id
FROM table_day_1 node1,
table_day_2 node2
WHERE node1.id(+) = node2.id
AND node1.id IS NULL -- deleted rows
您需要确保 Oracle 进行全表扫描。 如果您有很多 CPU 并且在您的数据库上启用了并行查询,请确保查询使用并行查询(因此提示)。 并且您希望在它们之间加入 hash。 与您的 DBA 合作以确保您有足够的临时空间来完成此操作,并且有足够的 PGA 来至少使用单通道工作区而不是多通道来处理此问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.