1. 程式人生 > >執行計劃組件、組件、老化

執行計劃組件、組件、老化

常用 參數 and 技術 第一個 prepare ros 處理 即使

一、執行計劃緩沖

  優化器生成的執行計劃保存在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 計劃句柄,內存中這個計劃的標識符,用於檢索查詢文本和執行計劃

  詳細可以到這裏了解:http://msdn.microsoft.com/zh-tw/library/windowsazure/hh977100.aspx

  單獨使用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中。

執行計劃組件、組件、老化