2012-06-29 15 views
1

我正在執行大量的從詳細表插入到SQL Server內的彙總表。我目前使用的左外連接,以確定是否從細節表的行中的彙總表已經存在之前將其插入如下面的例子:基於INSERT是否已經存在,執行INSERT的最有效方法是什麼?

INSERT INTO TableA 
     (columnA 
     ,columnB 
     ,columnC) 
SELECT 
    b.columnA, 
    b.columnB, 
    b.columnC 
FROM TableB b 
    LEFT OUTER JOIN TableA a 
     on a.columnA = b.columnA 
WHERE 
    a.columnA IS NULL 

我發現,這種方法需要大量的即使沒有要插入的行,因爲它必須比較所有行才能確定已存在的行。在這種情況下,我通常會考慮給TableB添加一個標誌來說明插入了哪些行。

但是,TableB中有一行需要插入TableA,這需要幾個標誌,我不希望使用存儲空間,因爲TableB非常大,而且長度也很大。

感謝您的任何建議。

+0

您是否嘗試改用合併語句?我認爲sql-server在使用它的時候會做一些額外的優化。 – mfussenegger

+1

你還可以在這些表上顯示PK和索引嗎? –

回答

3
INSERT INTO TableA (columnA, columnB, columnC) 
SELECT 
    b.columnA, 
    b.columnB, 
    b.columnC 
FROM TableB as b 
where not exists (select 1 from TableA as xx where xx.columnA = b.columnA) ; 
+0

哇,好建議。我修改了一個目前沒有記錄插入的較小的腳本,但之前仍需要花費將近3分鐘的時間來運行,並且在應用您的方法後花費了1秒。謝謝!猜猜我沒有完全理解「存在」關鍵字。 – Troy

相關問題