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

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

  • plan_handle:用于唯一標(biāo)識(shí)一個(gè)已編輯的查詢(xún)計(jì)劃,查詢(xún)計(jì)劃存儲(chǔ)在計(jì)劃緩存中;

一個(gè)sql_handle 能夠生成多個(gè)查詢(xún)計(jì)劃,對(duì)應(yīng)多個(gè)plan_handle,但是每個(gè)plan_handle只能對(duì)應(yīng)一個(gè)sql_handle 。

一,獲取查詢(xún)語(yǔ)句

視圖sys.dm_exec_query_stats 緩存的是單個(gè)查詢(xún)語(yǔ)句的執(zhí)行計(jì)劃,而sql_handler引用的是整個(gè)TSQL文本(Batch或SP),為了獲得單個(gè)查詢(xún)語(yǔ)句的文本,必須通過(guò)語(yǔ)句的偏移字段來(lái)抽取,偏移量是字節(jié),字節(jié)數(shù)量從0開(kāi)始: