執行計畫元件 元件 老化

2022-07-03 22:18:18 字數 2326 閱讀 9541

優化器生成的執行計畫儲存在sql server記憶體池中的乙個特別部分,被稱為計畫緩衝或過程緩衝。過程緩衝是sql server快取的一部分。在緩衝中儲存計畫可使sql server避免在重新提交相同的查詢時再次通過整個查詢優化過程執行。sql server支援不同的技術,如:計畫緩衝老化,計畫緩衝型別來增加快取的計畫的可重用性。它還儲存兩個被稱為hash和查詢計畫hash的二進位制值。

優化器生成的執行計畫包含兩個元件:

1、查詢計畫

查詢計畫是乙個可再入的唯讀資料結構,具備指定所有執行查詢所需要的物理操作的命令。可再入屬性使查詢計畫可以被多個連線併發訪問。物理操作包括所訪問的表和索引的規格,訪問的方式和順序,多個表之間執行的連線操作型別等。查詢計畫中沒有儲存使用者上下文。對於單個查詢,可能由兩個查詢計畫的拷貝:序列計畫和並行計畫。

2、執行上下文

執行上下文是維護查詢可變部分的另乙個資料結構。雖然伺服器在過程緩衝中記錄執行計畫,但是這些計畫是獨立於上下文的。因此,每個執行該查詢的使用者將有獨立的執行上下文,用來儲存專用於其執行的資料,如引數值和連線細節。

過程緩衝是sql server快取的一部分,sql server快取還儲存資料頁面。隨著不斷有新的執行計畫被新增到過程緩衝,過程緩衝將越來越大,影響記憶體中有用的資料頁面的儲存。為了避免這種情況,sql server動態控制過程緩衝中執行計畫的儲存,保留最常用的執行計畫並放棄在一段時間中不使用的計畫。

sql server將執行計畫與乙個壽命字段關聯,以此來記錄執行計畫重用的頻率。生成執行計畫時,壽命字段初始值用生成該計畫的開銷填充。需要大規模優化的複雜查詢將具有比簡單查詢功能更高的壽命字段值。

在固定的時間間隔,過程緩衝中所有執行計畫的壽命欄位由sql server的lazy writer程序確定(這個程序管理sql server中大部分的後台程序)。如果執行計畫長時間沒有被重用,壽命字段最終被減小為0。一旦執行計畫的壽命欄位為0,該計畫即成為從記憶體中刪除的候選者。sql server在記憶體壓力增加到沒有足夠的空閒記憶體以服務新的請求時,從過程緩衝刪除所有壽命欄位為0的計畫。但是,如果系統有足夠的記憶體並且有空閒的記憶體頁以服務新的請求,壽命欄位為0的執行計畫可以長期儲存在過程緩衝中,這樣他們在需要時可以重用。

除了老化,執行計畫在每次重用時,壽命欄位會增加生成計畫的開銷值。例如,假定有兩個執行計畫,生成開銷為100和10。它們起始的壽命字段值將分別為100和10。如果兩個計畫都立即被重用,它們的壽命分別增加到200和20。由於這些壽命字段值,lazy writer程序將第二個計畫的開銷值下降到0比第乙個計畫容易得多,除非第二個計畫更經常被重用。因此,即使乙個開銷較大的計畫重用的頻率小於更經濟的計畫,因為開銷對壽命欄位的影響,開銷較大的計畫仍然可能在更長時間裡保持非0的壽命值。

可以通過訪問動態管理檢視sys.dm_exec_cached_plans來獲得許多關於過程緩衝中執行計畫的資訊,如:

select * from sys.dm_exec_cached_plans
下面來看看這個檢視提供了哪些有用的資訊:

列名描述

refcounts

緩衝中引用該這個計畫的其他物件數量

usecounts

物件新增到緩衝計畫之後的使用次數

size_in_bytes

儲存在緩衝中的計畫大小

cacheobjtype

緩衝物件型別:

compiled plan:完整的執行計畫;

compiled plan stub:用於即席查詢的標記;

parse tree:用於訪問檢視的計畫;

objtype

生成該計畫的物件型別:

proc(過程);

prepared(預定義的);

ad hoc(即席);

view(檢視);

plan_handle

計畫控制代碼,記憶體中這個計畫的識別符號,用於檢索查詢文字和執行計畫

詳細可以到這裡了解:

單獨使用sys.dm_exec_cached_plans只能得到部分資訊。接下來的兩部分也一樣重要。使用動態管理函式sys.dm_exec_query_plans和sys.dm_exec_cached_plans組合,將可以得到xml執行計畫本身,這樣既可以顯示並處理它。如果接著引入sys.dm_exec_sql_text,還能檢索原始的查詢文字。這在執行這裡的例子中的已知查詢時看上去沒有用,但是當你轉到自己的生產系統並開始從緩衝中讀出執行計畫時,獲得原始查詢時很方便的,為了得到緩衝的計畫的詳細效能度量,可以使用sys.dm_exec_query_stats返回資料。除了其他資料之外,查詢hash和查詢計畫hash儲存在這個dmf中。

父子元件執行順序

vue的生命週期,從乙個例項物件被建立到例項物件被銷毀的過程就是該物件的生命週期。依次為 beforecreate created beforemount mounted beforeupdate updated beforedestory destoryed。該過程是嚴格按照先後順序來執行的 在元...

vue父元件自動執行子元件事件

父元件 mounted 使用created 失效子元件 methods 普通型別 字串 string 數字 number 布林值 boolean 空 null 引用型別 陣列 array 物件 object 其中,普通型別是可以在子元件中更改,不會影響其他兄 元件內同樣呼叫的來自父元件的值,但是,引...

介面元件的執行模式

android介面元件的執行模式包括standard singletop singletask singleinstance。standard 系統每次呼叫元件時就會產生新的元件物件。singletop 如果被呼叫的介面元件與該任務棧頂元件的型別一致,那麼系統就不會再為在介面元件構造新的物件,而是直...