我加载数据到表中以下列方式:删除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