在SQL Server上更新需要很长时间
我有300000行的“产品”表和4000行的“进口产品”表。此外,我有“查看进口产品”的看法,这是基于“进口产品”,使其形成良好 运行更新时:在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
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秒的时间来运行
我做错了什么,以及如何改进更新以快速运行
谢谢你的帮助
多谢各位
已更新
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