2011-08-22 88 views
2

大家好我有以下的SQL Server 2008腳本,將檢查一行是否已經存在於Table A,並且它不插入數據從Table B更好的方法來檢查數據是否已經存在,並插入

這工作很好,直到Table A開始填滿大量的數據。我們目前在這張表中有3000萬行,這將繼續增長到預計的7000萬行。

如果這個過程花費太長時間並影響其他過程,則會出現問題。只是想知道是否有更好的方法來檢查表中是否存在一行。只需添加,這一切都是使用SSIS完成的。

腳本:

INSERT INTO TABLE A ([recordID],Field 1, Field2, Field 3, Field 4, Field 5) 
    SELECT 
     [TABLE B].[recordID],[TABLE B].[Field 1], [TABLE B].[Field2], 
     [TABLE B].[Field 3], [TABLE B].[Field 4], [TABLE B].[Field 5] 
    FROM TABLE B AS TABLE B 
    LEFT OUTER JOIN TABLE A AS TABLE A ON [TABLE B].[recordID] = [TABLE A].[recordID] 
    WHERE [TABLE A].[recordID] IS NULL 
+0

請確保正確的非聚簇索引到位 - 最值得注意的是在'表A'和'表B'中的'RecordID'列(因爲這是在您的JOIN條件下) –

+0

我已經有一個RecordID索引在表A和表B上。但是我已經把它們設置爲集羣,它們應該是非集羣嗎? –

回答

3

不知道這是否會更快,但值得一試:

INSERT INTO TABLE A ([recordID],Field 1, Field2, Field 3, Field 4, Field 5) 

SELECT [TABLE B].[recordID],[TABLE B].[Field 1], [TABLE B].[Field2], [TABLE B].[Field 3], [TABLE B].[Field 4], [TABLE B].[Field 5] 
FROM TABLE B 
where b.recordID not in 
    (select recordID from A) 
+0

+1對於大多數使用情況,「NOT IN」或「NOT EXISTS」比「LEFT JOIN」快得多。 – JNK

0
  1. 如果是聚集索引,並且n ewly添加RecordId不是增量的,那麼預計會發生大量頁面溢出。確保設置最佳填充因子。
  2. 查找哪些操作需要花費時間,那麼解決起來會很簡單。如果搜索需要時間或插入需要時間?
相關問題