Sql-Server

sys.dm_exec_procedure_stats DMV 內容與 BOL 相矛盾

  • May 7, 2020

我正在對長時間執行的儲存過程進行一些分析,並且遇到了一些異常情況,根據線上書籍,每個記憶體儲存過程計劃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

這是由於 , , 等設置的執行時差異造成的ARITHABORTQUOTED_IDENTIFIERANSI_NULLS在以下文章中討論了這一點:

user_id

這並不是真正的使用者執行查詢,而是由於兩個不同的使用者具有不同的預設架構(值實際上是schema_id),並且其中至少一個正在呼叫沒有架構前綴的儲存過程(SQL Server 記憶體不同的計劃,因為搜尋路徑不同 - 它必須首先檢查預設模式)。我在上面的文章以及以下內容中談到了這一點:

(另外,請確保您正在查看該過程的總體計劃,而不是針對儲存過程中兩個完全不同的語句的兩個計劃,例如WHERE p.objtype = N'Proc'。)

引用自:https://dba.stackexchange.com/questions/117451