限制行数 - TSQL - 合并 - SQL Server 2008

时间:2011-08-23 13:48:17

标签: sql sql-server sql-server-2008 ssis

大家好我有以下合并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]
    );

2 个答案:

答案 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也应该适合您。