我正在使用Microsoft SSMS,而我正在尝试优化我在存储过程中使用的特别复杂的游标。
如果我在整个事情上运行一个执行计划(除了永远),每个部分都是批量的0%,因为光标运行大约1000次迭代,每次迭代似乎都有自己的条目。
如何只为游标的一次迭代获取执行计划,这样我才能真正判断其执行的哪些部分实际占用的时间最多?
包含它的相关性,它是一个在全局临时表上运行的fast_forward游标,可以进行大量选择和更新。
答案 0 :(得分:1)
将TOP 1添加到CURSOR SELECT查询中。 这只会向光标返回一条记录,让您更好地研究光标循环。
e.g。
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%)。