sys.dm_exec_procedure_stats DMV 內容與 BOL 相矛盾
我正在對長時間執行的儲存過程進行一些分析,並且遇到了一些異常情況,根據線上書籍,每個記憶體儲存過程計劃
sys.dm_exec_procedure_stats
應該只顯示一行,但是有一個使用者儲存過程在表中出現兩次。此儲存過程的兩個“版本”具有完全不同的執行時間/計數。
這僅僅是因為記憶體和使用了不同的計劃嗎?如果是這樣,我沒有意識到 sql server 為同一個 object_id 記憶體了多個計劃,我認為這是一種一進一出的交易?另外,如果是這種情況,它似乎與 BOLS 對 DMV 的定義相矛盾?
除此之外,如果有兩個版本的計劃正在使用,我如何知道在什麼情況下使用什麼計劃?
其他人遇到過這個嗎?
只是根據保羅的評論工作。Books Online 中的聲明與您的解釋之間的主要區別:
它說: …每個記憶體的儲存過程計劃一行。
您讀到: …每個記憶體儲存過程一行。
您可以通過查看屬性 DMV 的內容(按屬性名稱排序)來檢查哪些計劃屬性不同,從而導致計劃的不同副本。您應該至少看到一個屬性,其中相同文本的兩行在列中具有不同的值
value
。SELECT t.[text], pa.attribute, pa.value FROM sys.dm_exec_cached_plans AS p CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS t CROSS APPLY sys.dm_exec_plan_attributes(p.plan_handle) AS pa WHERE LOWER(t.[text]) LIKE N'%create%procedure%procedure_name%' AND LOWER(t.[text]) NOT LIKE N'%sys.dm%' AND pa.is_cache_key = 1 ORDER BY t.[text], pa.attribute;
通常,您會看到以下兩個屬性之一的差異:
set_options
這是由於 , , 等設置的執行時差異造成的
ARITHABORT
。QUOTED_IDENTIFIER
我ANSI_NULLS
在以下文章中討論了這一點:
user_id
這並不是真正的使用者執行查詢,而是由於兩個不同的使用者具有不同的預設架構(值實際上是
schema_id
),並且其中至少一個正在呼叫沒有架構前綴的儲存過程(SQL Server 記憶體不同的計劃,因為搜尋路徑不同 - 它必須首先檢查預設模式)。我在上面的文章以及以下內容中談到了這一點:(另外,請確保您正在查看該過程的總體計劃,而不是針對儲存過程中兩個完全不同的語句的兩個計劃,例如
WHERE p.objtype = N'Proc'
。)