我正在尝试创建一个维度表,当所有其他非null字段都匹配时,该表将要求使用NULL的记录被一个值覆盖。
此逻辑有效,并显示出我的意思是“ null = Value的值为TRUE”:
UPDATE A
SET
A.SSN = COALESCE(A.SSN, B.SSN)
,A.DOB = COALESCE(A.DOB, B.DOB)
,A.ID_1 = COALESCE(A.ID_1, B.ID_1)
,A.ID_2 = COALESCE(A.ID_2, B.ID_2)
,A.ID_3 = COALESCE(A.ID_3, B.ID_3)
,A.ID_4 = COALESCE(A.ID_4, B.ID_4)
FROM #TESTED1 A
INNER JOIN #TESTED1 B
ON (A.SSN = B.SSN
OR A.SSN IS NULL
OR B.SSN IS NULL)
AND (A.DOB = B.DOB
OR A.DOB IS NULL
OR B.DOB IS NULL)
AND (A.ID_1 = B.ID_1
OR A.ID_1 IS NULL
OR B.ID_1 IS NULL)
AND (A.ID_2 = B.ID_2
OR A.ID_2 IS NULL
OR B.ID_2 IS NULL)
AND (A.ID_3 = B.ID_3
OR A.ID_3 IS NULL
OR B.ID_3 IS NULL)
AND (A.ID_4 = B.ID_4
OR A.ID_4 IS NULL
OR B.ID_4 IS NULL)
WHERE A.ArbitraryTableID <> B.ArbitraryTableID
但是要评估的更多记录花费的时间成倍增加,10k条记录需要9秒,100k条记录需要9min,依此类推。我正在尝试进行大约3000万条记录的初始加载,然后我必须在每天进行MERGE操作并记录另外1万条记录。
例如,我需要以下两行(两者都存在于同一表中)才能合并为包含所有值的单行:不幸的是,成员可以有多个ID,所以我不能指望这些ID中的任何一个都是唯一的,甚至根本不存在以减少我的加入条件。
为了获得该查询的性能,请确保您有一个索引对要加入的所有条件进行排序。
我做了一个简短的例子,描述了您的描述:
`声明@test表(row_name NVARCHAR(50),id1 int null,id2 int null,id3 int空)
插入@test值('row1',1,2,3),('row2',1,4,5),('row3',11,null,null),('row4',null, 4,null),('row5',3,6,5),('row6',3,null,null)
选择*来自@test t1内部连接@test t2 on((t1.id1 = t2.id1或t1.id1为null或t2.id1为空)和(t1.id2 = t2.id2或t1.id2为空或t2.id2为空)和(t1.id3 = t2.id3或t1.id3为空或t2.id3为空))其中t1.row_name <> t2.row_name通过t1.row_name`订购]
我在测试输出中看到几个可能的问题: