簡體   English   中英

使用復合鍵在 Oracle 表中進行 20 億條記錄的增量檢測

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM