UPDATE需要很长时间才能使用SQL Server

时间:2016-11-14 20:49:21

标签: sql sql-server sql-server-2008 tsql

我有表“Products”300,000行,“Imported_Products”4,000行。另外,我查看了“View_Imported_Products”,它基于“Imported_Products”,使其形成良好。

当我运行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. 从View_ImportedProducts选择SKU - 运行速度非常快,需要00:00:00秒
  2. 更改查询以使用LEFT JOIN,而不是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
    )
    
    也需要很长时间才能执行

3 个答案:

答案 0 :(得分:1)

通过将“非聚集索引”添加到“Imported_Products”.SKU字段来解决它。我的错误是我在“View_Imported_Products”.SKU上添加了非聚集索引,而不是原始表。谢谢大家的帮助和回复!

答案 1 :(得分: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上创建非聚集索引

答案 2 :(得分:0)

如果正在更新大量行(数万个),那么您将在日志中创建一个重要的行。如果是这样,您希望一次更新1000行或10000行,然后提交。您的事务对事务日志的影响要小得多,并且执行速度会快得多。