【问题标题】:DELETE OUTPUT (T-SQL) really slow删除输出(T-SQL)真的很慢
【发布时间】:2023-03-13 21:17:01
【问题描述】:

下面的语句在 SQL Server 中确实很慢。今天开始的问题,DBA说SQL Server上没有阻塞。

DELETE p
OUTPUT   
1
, DELETED.ISBN
, 'BooksPlus'
, 'Products'
, DELETED.RecordOwner
, NULL
, NULL
, GETDATE()
, GETDATE() 
    
FROM products p
WHERE NOT EXISTS
(
SELECT 1
FROM temp p2
WHERE p.ISBN = LEFT(LTRIM(RTRIM(p2.F001_ISBN13)), 13)
) 
AND p.Recordowner IN ( 'HCANZ' )

如果我删除 Output 子句,代码将在 1 秒内运行。

DELETE p
FROM products p
WHERE NOT EXISTS
(
SELECT 1
FROM temp p2
WHERE p.ISBN = LEFT(LTRIM(RTRIM(p2.F001_ISBN13)), 13)
) 
AND p.Recordowner IN ( 'HCANZ' )

代码可以正常运行而不会出现问题。我可以检查什么来查看为什么输出子句开始变慢?该代码已经运行良好 2 年多了。问题从今天开始,我们将其范围缩小到此声明。

【问题讨论】:

  • 检查执行计划 - 这就是您调查所有性能问题的方式。
  • 为什么是 WHERE p.ISBN = LEFT(LTRIM(RTRIM(p2.F001_ISBN13)), 13) 而不是 WHERE p2.F001_ISBN13 LIKE p.ISBN + '%',这可能是 SARGable。 p2.F001_ISBN13 真的有前导空格吗?
  • DBA 说没有阻塞 那么这就是 DBA 所能提供的全部吗?没有尝试调查这个问题,没有提供收集执行计划的提议? “SELECT @@VERSION”的输出是什么?您要删除多少行(数量和百分比)?什么消耗了 OUTPUT 子句的结果集? “我们如何缩小范围”?

标签: sql sql-server tsql database-performance


【解决方案1】:

谢谢戴尔。您的评论为我指明了正确的方向。

我检查了 QA / PD 之间的差异,以确保结构仍然相同。因为 QA 仍然没有这个问题。其中一项指标在 PD 中被删除。

【讨论】:

  • 并且LEFT(LTRIM(RTRIM(p2.F001_ISBN13)), 13) 阻止使用F001_ISBN13 上的任何索引。插入时清理数据,不要试图在事后修剪它。顺便说一句,您可以在插入数据时使用TRIM()
  • PD 中删除了一个索引。这是一个更大的问题,您的团队需要调查和解决。这样的事情不应该在生产系统中“发生”!
  • 这是您的 DBA 应该确定的。
猜你喜欢
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2017-11-10
  • 2010-12-28
  • 2013-01-25
  • 1970-01-01
相关资源
最近更新 更多