2016-11-14 89 views
1

我有表「產品」300,000行,「Imported_Products」4,000行。此外,我還查看了基於「Imported_Products」的「View_Imported_Products」,以使其格式良好。UPDATE在SQL Server上花費很長時間

當我運行UPDATE:

UPDATE Products SET DateDeleted = GETDATE() 
WHERE Suppiler = 'Supplier1' AND SKU NOT IN (SELECT SKU FROM View_Imported_Products) 

這需要大量的時間,即使我運行它第二次,且行更新約1分鐘。

我增加了對Products.SKU和View_Imported_Products.SKU非聚集索引,也改變了我NOT IN到NOT EXISTS

UPDATE Products SET DateDeleted = GETDATE() FROM Products P 
WHERE Supplier = 'Supplier1' AND NOT EXISTS (SELECT SKU FROM View_Imported_Products I WHERE P.SKU=I.SKU) 

但它仍然需要大約16秒運行。

我在做什麼錯了,以及如何改進該更新以便快速運行。

感謝任何幫助。

謝謝

修訂

  1. SELECT SKU的View_ImportedProducts - 運行速度非常快,它需要00:00:00秒
  2. 更改的查詢使用LEFT JOIN,而不是NOT EXISTS - 沒有多大幫助
  3. SELECT * FROM Products AS P 
    WHERE P.Supplier = 'Supplier1' AND DateDeleted IS NULL 
    AND 
    NOT EXISTS 
    (
        SELECT 
         SKU 
        FROM View_ImportedProducts AS I 
        WHERE P.SKU = I.SKU 
    ) 
    
    需要很長時間才能執行
+1

你真的需要使用視圖嗎?,你不能直接使用'Imported_Products'嗎? – Lamak

+2

執行計劃的外觀如何?您嘗試更新多少條記錄?您正在更新的記錄的值是否有索引? – Igor

+0

你是否有產品表上的任何東西,比如索引視圖或類似的東西? – jabs

回答

0

爲什麼不使用連接

UPDATE Products SET DateDeleted = GETDATE()  FROM Products P 
Left join View_Imported_Products I On  P.SKU=I.SKU 
Where I.Sku is null 

而且你必須創建p.sku和i.sku

+0

爲什麼這個連接會更快?在SQL Server中,'NOT EXISTS'通常比'LEFT JOIN ... IS NO NULL'執行得更好' – Lamak

+0

聯接比使用從屬子查詢更好。 – Hadi

+0

'SELECT SKU FROM View_Imported_Products I WHERE P.SKU = I.SKU'在過濾之前加載更多的數據 – Hadi

0

非聚集索引如果很多行(幾萬)正在更新你正在創造日誌上的重大打擊。如果是這樣,您想一次更新1000或10000行,然後提交。您的交易對交易日誌的影響要小得多,而且執行速度會更快。

1

通過將非聚集索引添加到「Imported_Products」.SKU字段解決了此問題。我的錯誤是我在「View_Imported_Products」.SKU上添加了非聚集索引,而不是原始表格。謝謝大家的幫助和答覆!