我正在使用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%)。