在SQL Server上更新需要很长时间

在SQL Server上更新需要很长时间,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有300000行的“产品”表和4000行的“进口产品”表。此外,我有“查看进口产品”的看法,这是基于“进口产品”,使其形成良好 运行更新时: UPDATE Products SET DateDeleted = GETDATE() WHERE Suppiler = 'Supplier1' AND SKU NOT IN (SELECT SKU FROM View_Imported_Products) 即使我第二次运行它并且没有行更新,它也需要大约1分钟的时间 我在Products.SKU和Vie

我有300000行的“产品”表和4000行的“进口产品”表。此外,我有“查看进口产品”的看法,这是基于“进口产品”,使其形成良好

运行更新时:

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秒的时间来运行

我做错了什么,以及如何改进更新以快速运行

谢谢你的帮助

多谢各位

已更新

  • 从“查看导入的产品”中选择SKU-运行速度非常快,需要00:00:00秒
  • 将查询更改为使用左连接,而不是不存在-没有多大帮助
  • 执行也需要很长时间
  • 为什么不使用连接

    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上创建非聚集索引

    如果有很多行(上万行)正在更新,那么您将在日志上创建一个大的点击。如果是这样,您希望一次更新1000行或10000行,然后提交。您的事务对事务日志的影响要小得多,执行速度也要快得多。

    通过在“导入的产品”SKU字段中添加非聚集索引来解决此问题。我的错误是我在“View\u Imported\u Products.SKU”上添加了非聚集索引,而不是原始表。谢谢大家的帮助和回复

    你真的需要使用视图吗?你不能直接使用导入的产品吗?执行计划是什么样子的?您要更新多少条记录?您正在更新的记录的值是否有索引?是否在products表上构建了任何内容,如索引视图或类似内容?运行该视图需要多长时间?你能分享其中的内容吗?这取决于你运行它的时间,如果你担心锁,你可以试试tablock。为什么这个连接会更快?。在SQL Server中,
    NOT EXISTS
    通常比
    LEFT JOIN…执行得更好。
    连接比使用依赖子查询更好。
    从视图中选择SKU\u Imported\u Products I,其中P.SKU=I.SKU
    在过滤之前加载了更多数据。您能用一些源备份吗?,因为LEFT JOIN没有多大帮助,同样长的时间
    UPDATE Products SET DateDeleted = GETDATE()     FROM Products P
    Left join View_Imported_Products I On     P.SKU=I.SKU
    Where I.Sku is null