【问题标题】:UPDATE takes long time on SQL ServerUPDATE 在 SQL Server 上需要很长时间
【发布时间】: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 秒才能运行。

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

感谢任何帮助。

谢谢

更新

  1. SELECT SKU FROM View_ImportedProducts - 运行速度非常快,需要 00:00:00 秒
  2. 将查询更改为使用 LEFT JOIN,而不是 NOT 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
    )
    
    执行也需要很长时间

【问题讨论】:

  • 你真的需要使用视图吗?不能直接使用Imported_Products吗?
  • 执行计划是什么样的?您要更新多少条记录?您正在更新的记录的值是否有索引?
  • 您是否在 products 表上构建了任何东西,例如索引视图或类似的东西?
  • 运行视图需要多长时间?能分享一下里面的内容吗?
  • 取决于你运行它的时间,如果你担心锁定,你可以试试tblock。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      为什么不使用连接

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

      【讨论】:

      • 为什么这个连接会更快?在 SQL Server 中,NOT EXISTS 的性能通常优于 LEFT JOIN ...IS NO NULL
      • 加入比使用依赖子查询更好。
      • SELECT SKU FROM View_Imported_Products I WHERE P.SKU=I.SKU 在过滤之前加载更多数据
      • 你能用一些来源备份它吗?因为 I'm pretty sure that for SQL Server that's wrong
      • 左连接没有多大帮助,同样的时间
      猜你喜欢
      • 1970-01-01
      • 2011-12-26
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-02
      • 1970-01-01
      相关资源
      最近更新 更多