获取存储函数的实际计划

Get an actual plan for a stored function

我想为我的标量函数获取执行计划,因为它与我只是 运行 函数体时的执行计划不同。前段时间我遇到过同样的情况,我通过对索引进行碎片整理来解决它(函数没有使用碎片化索引,因为碎片化程度很高,但是纯查询使用了)。但现在我有 <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)

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

这个函数只是从 table 中取出一些 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

好吧,回答我最初的问题:您可以使用 SQL Server Profiler 分析您的数据库并获得所有执行查询的计划,只需在 new trace 设置中切换一个复选框。