我想获得标量函数的执行计划,因为它与我只运行函数体时的执行计划不同。我前段时间处于同样的情况,我通过对索引进行碎片整理来解决它(由于碎片很多,函数没有使用碎片索引,但纯粹的查询确实如此)。但现在我有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)
纯查询的实际计划(快速): 功能(慢):
这个函数只是从表中获取一些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
答案 0 :(得分:0)
好吧,回答我的初步问题:您可以使用SQL Server Profiler
并对数据库进行概要分析并获取所有正在执行的查询的计划,只需在new trace
设置中切换chechbox。