Sql查詢過程 數據庫
當執行一個Sql語句或者存儲過程時, Sql Server的大體過程是緩存
1. 對查詢語句進行分析,將其生成邏輯單元,並進行基本的語法檢查性能
2. 生成查詢樹(會將查詢語句中全部操做轉換爲對基表的操做,好比將視圖轉換爲基表查詢)優化
3. 生成執行計劃(針對查詢樹會生成不少不一樣的執行計劃)spa
4. 查詢優化器基於每一個執行計劃的查詢成本和數據庫中的統計信息,選擇一個最優執行計劃code
5. 最優執行計劃會被緩存在數據庫的緩存池中。當再次執行相同Sql語句時,緩存的執行計劃會被直接使用。這樣能夠提升性能。xml
查看緩存執行計劃DMV blog
經過sys.dm_exec_cached_plans能夠查詢到當前系統緩存的執行計劃。好比:以下代碼能夠查詢緩存的全部爲存儲過程生成的最優執行計劃內存
select * from sys.dm_exec_cached_plans where objtype = 'Proc'
查詢結果中顯示了該執行計劃被重複使用的次數。io
注:普通的存儲過程是在第一次被執行的的時候纔會被編譯,而後生成執行計劃並緩存。
經過上面對查詢過程的描述,咱們經過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. 而當數據庫內存不足時,也會經過特定的機制將使用頻率低的執行計劃從緩存中清除。