当我执行这个简单的SP,然后从后面的DMV查询中检查查询计划时,查询计划将返回为NULL。但是如果我注释掉SP中的else块(或者将其更改为非引用临时表),则DMV查询会显示查询计划。知道造成这种差异的原因是什么吗?并且NULL查询计划是否意味着没有缓存?我正在使用SQL Server 2008 R2。
CREATE PROCEDURE dbo.SampleSp
(
@Option TINYINT
)
AS
DECLARE @RowCount INT;
-- Get ID into local temp table
CREATE TABLE #P (ID INT PRIMARY KEY);
INSERT INTO #P
VALUES (1), (2)
IF @Option = 1
BEGIN
SELECT ID FROM #P
END
ELSE
BEGIN
SELECT ID FROM #P
END
GO
--Call SP
EXEC dbo.SampleSp 1
GO
--DMV Query to find query_plan
SELECT
CP.objtype,
CP.usecounts AS Ct,
ST.last_execution_time,
SUBSTRING(Text, (statement_start_offset / 2) + 1, (CASE statement_end_offset WHEN -1 THEN DATALENGTH(Text) ELSE statement_end_offset END - ((statement_start_offset / 2) + 1))) AS query,
T.text,
PL.query_plan
FROM sys.dm_exec_cached_plans AS CP WITH(NOLOCK)
CROSS APPLY sys.dm_exec_sql_text(CP.plan_handle) AS T
OUTER APPLY sys.dm_exec_query_plan(CP.plan_handle) AS PL
LEFT OUTER JOIN sys.dm_exec_query_stats AS ST WITH(NOLOCK) ON ST.plan_handle = CP.plan_handle
WHERE 1=1
AND ST.last_execution_time > DATEADD(MINUTE, -5, GETDATE())
AND T.text LIKE '%SampleSp%'
AND T.text NOT LIKE '%dm_exec_cached_plans%'
ORDER BY ST.last_execution_time DESC
答案 0 :(得分:1)
我相信我明白了。似乎该计划将显示为NULL,直到SP中的每个分支都已执行。 (您可以通过再次调用SP来查看此参数值为2,然后计划确实显示。)如果只执行了部分SP,则SQL Server会在内部执行缓存(您可以看到此内容)通过查看usecounts,以及我用来证明这一点的其他更广泛的测试,但它不会出现在我使用的DMV查询中。这提出了一个问题:您如何查看已缓存的SP部分的计划?