1. 程式人生 > >Sql Server中執行計劃的緩存機制

Sql Server中執行計劃的緩存機制

機制 大致 sql語句 color 內存 存儲過程 image 語法檢查 轉換

Sql查詢過程      

當執行一個Sql語句或者存儲過程時, Sql Server的大致過程是

1. 對查詢語句進行分析,將其生成邏輯單元,並進行基本的語法檢查

2. 生成查詢樹(會將查詢語句中所有操作轉換為對基表的操作,比如將視圖轉換為基表查詢)

3. 生成執行計劃(針對查詢樹會生成很多不同的執行計劃)

4. 查詢優化器基於每個執行計劃的查詢成本和數據庫中的統計信息,選擇一個最優執行計劃

5. 最優執行計劃會被緩存在數據庫的緩存池中。當再次執行相同Sql語句時,緩存的執行計劃會被直接使用。這樣可以提高性能。

查看緩存執行計劃DMV  

通過sys.dm_exec_cached_plans可以查詢到當前系統緩存的執行計劃。比如:如下代碼可以查詢緩存的所有為存儲過程生成的最優執行計劃

select * from sys.dm_exec_cached_plans where objtype = Proc

技術分享圖片

查詢結果中顯示了該執行計劃被重復使用的次數。

註:普通的存儲過程是在第一次被執行的的時候才會被編譯,然後生成執行計劃並緩存。

通過上面對查詢過程的描述,我們通過Management Studio直接執行的語句的執行計劃也會被緩存。

通過如下查詢可以得到緩存的列表

select * from sys.dm_exec_cached_plans where objtype = Adhoc

同時,通過查詢sys.dm_exec_text_query_plan可以得到某個查詢計劃的詳細信息。比如:以下代碼可以查詢上面所描述存儲過程的執行計劃的詳情

declare @planHandle varbinary(64)
SELECT @planHandle = plan_handle from sys.dm_exec_cached_plans where bucketid = 6124
select * from sys.dm_exec_text_query_plan(@planHandle,0,-1)

結果如下:

技術分享圖片

query_plan列的值是描述執行計劃詳情的xml

執行計劃的管理    

1. 當數據庫重啟時會被清空。然後我們也可以通過執行DBCC FREEPROCCACHE來清空緩存。

2. 而當數據庫內存不足時,也會通過特定的機制將使用頻率低的執行計劃從緩存中清除。

Sql Server中執行計劃的緩存機制