【发布时间】:2016-11-15 08:05:22
【问题描述】:
我的表“Products”有 300,000 行,“Imported_Products”有 4,000 行。我还查看了基于“Imported_Products”的“View_Imported_Products”以使其格式良好。
当我运行更新时:
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 秒才能运行。
我做错了什么,以及如何改进该更新以使其快速运行。
感谢任何帮助。
谢谢
更新
- SELECT SKU FROM View_ImportedProducts - 运行速度非常快,需要 00:00:00 秒
- 将查询更改为使用 LEFT JOIN,而不是 NOT EXISTS - 没有多大帮助
-
执行也需要很长时间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 )
【问题讨论】:
-
你真的需要使用视图吗?不能直接使用
Imported_Products吗? -
执行计划是什么样的?您要更新多少条记录?您正在更新的记录的值是否有索引?
-
您是否在 products 表上构建了任何东西,例如索引视图或类似的东西?
-
运行视图需要多长时间?能分享一下里面的内容吗?
-
取决于你运行它的时间,如果你担心锁定,你可以试试tblock。
标签: sql sql-server sql-server-2008 tsql