当我执行这个简单的SP,然后从后面的DMV查询中检查查询计划时,查询计划返回为NULL。但是,如果我注释掉SP中的else块(或将其更改为不引用临时表),DMV查询将显示查询计划。你知道是什么导致了这种差异吗?空查询计划是否意味着没有缓存任何内容?我使用的是SQL Server2008 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发布于 2013-01-15 05:37:14
我想我已经弄明白了。在执行完SP中的所有分支之前,该计划似乎将显示为NULL。(您可以通过使用参数值2再次调用SP来查看这一点,然后显示计划。)如果只执行了SP的一部分,SQL Server就会在内部缓存而不是计划(您可以通过查看usecounts以及我为证明这一点所做的一些其他更广泛的测试来了解这一点),但它不会显示在我使用的DMV查询中。这就提出了一个问题:如何仅查看已缓存的SP部分的计划?
https://stackoverflow.com/questions/14326146
复制相似问题