我加載數據到表中以下列方式:刪除VS回滾策略 - ETL負載
DECLARE @srcRc INT;
DECLARE @dstRc INT;
SET @srcRc = (SELECT COUNT(*) FROM A)
INSERT INTO t
(Col1
,Col2
,Col3
)
SELECT A.Col1
,A.Col2
,B.Col3
FROM A
JOIN B
ON A.Id = B.Id;
SET @dstRc = @@ROWCOUNT
現在我比較變量@srcRc
和@dstRc
。 ROWCOUNT
必須相同。如果不是,則需要刪除插入的行。
Q1:回滾插入行的最佳策略是什麼?
我有幾個想法:
1)運行負荷在交易和回滾,如果行數不匹配。
2)標誌列(位)添加到名爲toBeDeleted
目標表,運行負荷,如果行數不匹配,與1
價值,將其標記爲候選刪除更新toBeDeleted
列。然後刪除批處理模式(while-loop)。
或者不要刪除它們,但在使用t
表時,始終排除查詢中的刪除候選項。
3)插入行之前,首先比較行數。如果不匹配,請不要啓動負載。
DECLARE @srcRc INT;
DECLARE @dstRc INT;
SET @srcRc = (SELECT COUNT(1) FROM A);
SET @dstRc = (SELECT COUNT(1) FROM A JOIN B ON A.Id = B.Id);
Q2:什麼是更高金額的行更好的解決方案,讓我們說10-100萬?
問題3:還是有類似的情況下更好的策略?
我只需要回滾「當前」負載,而不是歷史。所以通常我一天一天地加載。今天我加載日期N,明天N + 1。所以只檢查當前批次的行數。 如果rowcount不匹配,則所有來自當前加載的內容都需要被擦除,而不僅僅是一些行。 – DNac
這些情況的麻煩在於它不是真正的回滾,除非你撤銷你做的任何事情。任何依賴簡單行數的東西都可能出錯。例如,您複製行x並跳過行y。你的排數將匹配 – Ewan
這是真的,但這種情況從來沒有發生過,我認爲這是非常罕見的。 – DNac