我有表“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秒才能运行。
我做错了什么,以及如何改进该更新以快速运行它。
感谢任何帮助。
谢谢
已更新
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
)
也需要很长时间才能执行答案 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行,然后提交。您的事务对事务日志的影响要小得多,并且执行速度会快得多。