大家好我有以下合并sql脚本,适用于相对较少的行(我发现最多约20,000)。但是,有时表B中的数据最多可达100,000行,并尝试将其与表A(目前为6,000万行)合并。这需要花费很长时间来处理,这是可以理解的,因为它必须将100,000与现有的6千万条记录合并!
我只是想知道是否有更好的方法来做到这一点。或者是否可以进行某种计数,因此将表B中的20,000行合并到表A.然后从表B中删除那些合并的行。然后执行接下来的20,000行,依此类推,直到表B没有剩下的行? / p>
脚本:
MERGE
Table A AS [target]
USING
Table B AS [source]
ON
([target].recordID = [source].recordID)
WHEN NOT MATCHED BY TARGET
THEN
INSERT([recordID],[Field 1]),[Field 2],[Field 3],[Field 4],[Field 5])
VALUES([source].[recordID],[source].[Field 1],[source].[Field 2],[source].[Field 3],[source].[Field 4],[source].[Field 5]
);
答案 0 :(得分:3)
MERGE
对此非常过分,因为您只需要INSERT
个缺失值。
尝试:
INSERT INTO Table_A
([recordID],[Field 1]),[Field 2],[Field 3],[Field 4],[Field 5])
SELECT B.[recordID],
B.[Field 1],B.[Field 2],B.[Field 3],B.[Field 4],B.[Field 5]
FROM Table_B as B
WHERE NOT EXISTS (SELECT 1 FROM Table_A A
WHERE A.RecordID = B.RecordID)
根据我的经验,MERGE
对于像这样的简单操作可能会表现得更差。我尝试保留它,以便根据条件需要不同的操作,例如UPSERT。
答案 1 :(得分:2)
您绝对可以在(SELECT TOP 20000 * FROM B ORDER BY [some_column]) as [source]
中USING
进行操作,然后在MERGE
之后删除这些记录。所以伪代码看起来像:
1. Merge top 20000
2. Delete 20000 records from source table
3. Check @@ROWCOUNT. If it's 0, exit; otherwise goto step 1
我不确定它是否比同时合并所有记录更快。
此外,您确定需要MERGE
吗?从我在您的代码中看到的INSERT INTO ... SELECT
也应该适合您。