【发布时间】: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