获取存储函数的实际计划

时间:2015-04-06 10:07:35

标签: sql sql-server sql-server-2008-r2 sql-execution-plan

我想获得标量函数的执行计划,因为它与我只运行函数体时的执行计划不同。我前段时间处于同样的情况,我通过对索引进行碎片整理来解决它(由于碎片很多,函数没有使用碎片索引,但纯粹的查询确实如此)。但现在我有0.1%的碎片。

我可以得到适当的估计执行计划,但是当我想得到一个实际的计划时, 我什么都没得到。

所以在这里我只得到无用的外部查询计划,但不知道功能上发生了什么。

可以修复吗?


估计执行计划:

<ParameterList>
  <ColumnReference Column="@DateTo" ParameterCompiledValue="NULL" />
  <ColumnReference Column="@DateFrom" ParameterCompiledValue="NULL" />
  <ColumnReference Column="@ServerID" ParameterCompiledValue="NULL" />
  <ColumnReference Column="@ResourceTypeID" ParameterCompiledValue="NULL" />
</ParameterList>

我找到了该功能的实际执行计划(感谢Sql Server Profiler)

纯查询的实际计划(快速): enter image description here 功能(慢): enter image description here

这个函数只是从表中获取一些XML字段并将它们连接成一个大的XML文件:

ALTER FUNCTION [dbo].[fn_GetErrorXML]
(   
    @DateFrom datetime,     
    @DateTo datetime,       
    @ResourceTypeID bigint,  
    @ServerID int           
)
RETURNS NVARCHAR(MAX) 
AS
BEGIN 

    DECLARE @ErrorDescription VARCHAR(MAX)
    SET @ErrorDescription = '<root>';
    WITH CTE AS
    (   

        SELECT 
            d.GeneratedOnUtc,
            ErrorDescription = cast(d.Data as nvarchar(max))
        FROM dbo.AgentData d
          INNER JOIN dbo.Agent a ON a.CheckID = d.CheckID
          INNER JOIN dbo.Server s ON a.ServerID = s.ID
        WHERE d.EventType = 'Result' AND
              a.ResourceTypeID & @ResourceTypeID > 0 AND
              s.ID = @ServerID AND
              d.GeneratedOnUtc between @DateFrom AND @DateTo AND
              d.Result = 0                            
    )
    SELECT @ErrorDescription = @ErrorDescription + cte.ErrorDescription
    FROM CTE    
    ORDER BY cte.GeneratedOnUtc ASC

    RETURN(@ErrorDescription + '</root>')
END

1 个答案:

答案 0 :(得分:0)

好吧,回答我的初步问题:您可以使用SQL Server Profiler并对数据库进行概要分析并获取所有正在执行的查询的计划,只需在new trace设置中切换chechbox。