【问题标题】:Deleting same number of records from SQL Server database takes either 0.2 sec or 30 sec从 SQL Server 数据库中删除相同数量的记录需要 0.2 秒或 30 秒
【发布时间】:2015-11-30 12:56:56
【问题描述】:

我正在使用 SQL Server 2008 R2。我正在从表中删除约 5000 条记录。当我使用相同的数据测试性能时,我发现删除需要 1 秒或 31 秒。

测试数据库是保密的,所以不能在这里分享。

我已经尝试分离负载,一次只删除1000条记录,但我仍然遇到偏差。

我应该如何继续我的调查?性能差异的原因可能是什么?

查询很简单,例如:delete from PART where INVOICE_ID = 64225

【问题讨论】:

  • 请贴出查询和查询的执行计划。
  • 什么时候需要 1 秒,什么时候需要 31 秒?它是可重现的还是不可预测的?
  • 我注意到的唯一模式是它在 1-4 次执行后发生变化(例如,慢一次,然后快 4 次,反之亦然)
  • 是否有其他进程,访问同一个数据库或同一个服务器?在 SQL 监控工具中,您还看到了哪些其他活动,您看到了什么样的等待(网络 IO、磁盘 IO)?查询性能是否取决于记录内容 - 一些触发器或存在级联删除的外键?
  • @TT 我可以用什么格式发布执行计划?我有来自分析器或 sqlplan 文件的 XML

标签: sql-server


【解决方案1】:

DELETE 子句使用大量系统和事务日志资源,这就是为什么它会花费大量时间。如果可能,请尝试截断表格。

【讨论】:

  • TRUNCATE 不是一个选项(将查询添加到问题)。我知道删除很昂贵,但奇怪的是相同的删除既便宜(1 秒)又贵(30 秒)。
【解决方案2】:

当您第一次运行 DELETE 时,可能数据不在缓冲池中,因此必须从存储中读取,第二次运行时它将在存储中。其他因素包括检查点进程是否将更改的页面运行到存储中。发布您的查询计划 ->

set statistics xml on

select * from sys.objects

set statistics xml off

【讨论】:

    【解决方案3】:

    啊!在仔细查看执行计划后,我注意到缺少一个索引。添加索引后,所有执行都运行得很快。请注意,在此之后我删除了索引以测试问题是否再次出现。性能偏差再次出现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-01
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 2012-03-22
      • 2014-11-28
      相关资源
      最近更新 更多