0

在另一篇文章(什么导致 DMV 显示 NULL 查询计划?)中,我发现我的 DMO 查询为 query_plan 返回 NULL,除非 SP 中的所有代码分支都已执行。我知道即使所有分支都没有执行,SQL Server 也会缓存 SP 中的语句,但我不知道使用什么查询来查找该计划。有吗?我从另一个问题复制了下面的相同代码以重现该问题。

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 > GETDATE() - .005 -- within about the last 5 min
AND T.text LIKE '%SampleSp%'
AND T.text NOT LIKE '%dm_exec_cached_plans%'
ORDER BY ST.last_execution_time DESC
4

0 回答 0