【问题标题】:deleting 500 records from table with 1 million records shouldn't take this long从具有 100 万条记录的表中删除 500 条记录不应该花这么长时间
【发布时间】:2015-04-30 14:36:24
【问题描述】:

我希望有人可以帮助我。我有一个简单的sql语句

delete from sometable 
where tableidcolumn in (...)

我有 500 条记录要删除并重新创建。该表最近增长到超过 1 个工厂记录。问题是上面的语句需要超过 5 分钟才能完成。我有一个主键和 2 个非聚集非唯一索引。我的删除语句正在使用主键。

谁能帮我理解为什么这个语句需要这么长时间以及如何加快速度?

【问题讨论】:

  • 可能是级联关系?还是删除触发器?
  • in(...) 列表中的值来自哪里?另一个查询还是硬编码?你可以更新而不是删除/创建吗?
  • 选择它们需要多长时间? SELECT 1 FROM sometable where tableidcolumn in (...)?
  • 您尝试过使用 FORCESEEK 吗?
  • 发布执行计划。

标签: sql sql-server sql-server-2008 sql-delete


【解决方案1】:

我首先要看两个方面,锁定和糟糕的计划。

锁定 - 运行您的查询,并在它运行时查看它是否被其他任何东西阻止“select * from sys.dm_exec_requests where blocking_session_id 0”如果您看到任何阻止您的请求的东西,那么我会开始查看:

https://www.simple-talk.com/sql/database-administration/the-dba-as-detective-troubleshooting-locking-and-blocking/

如果没有锁定则获取插入的执行计划,它在做什么?它异常高吗?

除此之外,您预计需要多长时间?是比那个长一点还是长得多?是在显着增长之后才变得这么慢还是在很长一段时间内变得越来越慢?

I/O 性能是多少,平均读/写时间是多少等。

【讨论】:

  • 大家,感谢您的评论。我正在审核,我会尽快跟进。
【解决方案2】:

TL;DR:不要那样做(而不是大的“in”子句:预加载并使用临时表)。

由于参数的数量,未知的后端配置(即使按照今天的标准应该没问题)并且无法猜测处理过程中您的内存大小可能是多少,您可能会遇到问题(按顺序)堆栈、批次或memory size 限制,以this answer 开头。也可以点击instruction size limit

故障排除 cmets 可能会引导您找到另一个答案。我的重点是“in”子句、语句大小,并且所有这些链接都包含 advice 以预加载一个临时表并将其与您的查询一起使用。

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2011-03-11
    • 2023-01-07
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    相关资源
    最近更新 更多