游标单次迭代的执行计划



我正在使用Microsoft SSMS,并试图优化我在存储过程中使用的一个特别复杂的游标。

如果我对整件事运行一个执行计划(除了永远执行之外),每个部分都是批处理的0%,因为光标运行了大约1000次迭代,每个迭代似乎都有自己的条目。

如何只为游标的一次迭代获得执行计划,这样我就可以判断它的执行中哪些部分实际上花费了最多的时间?

如果它是相关的,它是一个在全局临时表上运行的fast_forward游标,用于执行一系列选择和更新。

将TOP 1添加到CURSOR SELECT查询中。这将只向游标返回一个1记录,从而使您能够更好地研究游标循环。

例如

DECLARE cursor_name CURSOR FAST_FORWARD
FOR
SELECT TOP 1 ....
FROM ...

我采用以下方法来配置光标:
SQL Server游标非常慢。如果您有一个声明游标的大型复杂查询,您可能会发现它本身消耗了50%的执行时间(在FETCH NEXT操作中)。我用游标评测SP的方法是在SP代码的开头添加执行时间计数器,例如

DECLARE @StartTime DATETIME
DECLARE @CodeBlock1Duration BIGINT
DECLARE @CodeBlock2Duration BIGINT
SELECT @CodeBlock1Duration = 0, @CodeBlock2Duration = 0

等等。然后在循环内捕获特定部分的执行持续时间如下:

SET @StartTime = GETDATE()
-- Some code block
SET @CodeBlock1Duration = @CodeBlock1Duration + DATEDIFF( ms, @StartTime, GETDATE())

在迭代中执行,即先将几个计数器添加到大块代码中。运行SP,然后分析结果。对于长时间运行的代码块,在单个查询周围添加更多计数器。总是在FETCH NEXT零件周围添加一个计数器,因为这可能需要比你想象的更多的时间(见上面的50%)。

最新更新