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


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. 而當數據庫內存不足時,也會通過特定的機制將使用頻率低的執行計划從緩存中清除。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM