數(shù)據(jù)庫引擎接收到一個新的查詢請求(Batch或SP),查詢優(yōu)化器會生成執(zhí)行計劃,并緩存到內(nèi)存中;下次再次執(zhí)行相同的查詢請求時,數(shù)據(jù)庫引擎從復(fù)用已經(jīng)緩存的執(zhí)行計劃,換句話,數(shù)據(jù)庫引擎為每一個查詢請求生成執(zhí)行計劃,并把已經(jīng)生成的執(zhí)行計劃緩存起來,當(dāng)接收到相同的查詢請求時,數(shù)據(jù)庫引擎復(fù)用已緩存的執(zhí)行計劃。查詢請求(Batch或SP)中的每一個查詢語句的執(zhí)行計劃,都會被緩存到內(nèi)存中,數(shù)據(jù)庫引擎統(tǒng)計執(zhí)行計劃的性能參數(shù),緩存在DMV:sys.dm_exec_query_stats中,在該視圖中,每一行數(shù)據(jù)都表示一個查詢語句的統(tǒng)計數(shù)據(jù):

  • sql_handle:用以唯一標(biāo)識一個TSQL文本(Batch或SP),TSQL文本存儲在SQL Manager Cache(SQLMGR)中;

  • plan_handle:用于唯一標(biāo)識一個已編輯的查詢計劃,查詢計劃存儲在計劃緩存中;

一個sql_handle 能夠生成多個查詢計劃,對應(yīng)多個plan_handle,但是每個plan_handle只能對應(yīng)一個sql_handle 。

一,獲取查詢語句

視圖sys.dm_exec_query_stats 緩存的是單個查詢語句的執(zhí)行計劃,而sql_handler引用的是整個TSQL文本(Batch或SP),為了獲得單個查詢語句的文本,必須通過語句的偏移字段來抽取,偏移量是字節(jié),字節(jié)數(shù)量從0開始: