標籤:結果 機制 img 記憶體 計劃 back nbsp round 很多
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 = 6124select * from sys.dm_exec_text_query_plan(@planHandle,0,-1)
結果如下:
query_plan列的值是描述執行計畫詳情的xml
執行計畫的管理
1. 當資料庫重啟時會被清空。然後我們也可以通過執行DBCC FREEPROCCACHE來清空緩衝。
2. 而當資料庫記憶體不足時,也會通過特定的機制將使用頻率低的執行計畫從緩衝中清除。
Sql Server中執行計畫的緩衝機制