1

この単純なSPを実行し、次のDMVクエリからクエリプランを確認すると、クエリプランはNULLとして返されます。しかし、SPのelseブロックをコメントアウトする(または一時テーブルを参照しないように変更する)と、DMVクエリはクエリプランを表示します。この違いの原因は何ですか?また、NULLクエリプランは、何もキャッシュされなかったことを意味しますか?SQL Server2008R2を使用しています。

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
4

1 に答える 1

2

私はそれを理解したと信じています。SP のすべてのブランチが実行されるまで、計画は NULL として表示されるようです。(これは、パラメータ値 2 を指定して SP を再度呼び出すことで確認できます。すると、計画が表示されます。) SP の一部のみが実行された場合、SQL Server は内部的に計画よりもキャッシュを行います (これを確認できます)。 usecounts と、これを証明するために私が行った他のいくつかのより広範なテストを調べることによって)、しかし、私が使用した DMV クエリには表示されません。ここで疑問が生じます: キャッシュされた SP の一部だけの計画をどのように表示しますか?

于 2013-01-14T21:37:13.953 に答える