當我執行這個簡單的SP,然後檢查從下面的DMV查詢的查詢計劃,查詢計劃回來爲NULL。但是,如果我註釋掉SP中的else塊(或將其更改爲不引用臨時表),則DMV查詢確實會顯示查詢計劃。任何想法是什麼造成這種差異?並且NULL查詢計劃意味着什麼都沒有被緩存?我正在使用SQL Server 2008 R2。是什麼導致DMV顯示NULL查詢計劃?
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
請使用DATEADD(MINUTE,-5,GETDATE()) - 日期/時間隱含的數學不會爲新的數據類型的工作,並在某些時候,這些動態管理視圖可以切換到更高的精度和您所有的疑問將打破。 –
但是,回到問題,您是否啓用了「優化ad hoc工作負載」設置?也許沒有查詢計劃會回來,因爲您只運行一次查詢,並且只存儲了一個存根。 –
不,不啓用對ad hoc工作負荷設置的優化。 – JohnnyM