原文:
第一章(3)——執行計畫重用
對於伺服器來說,所有查詢處理都產生出執行計畫是非常昂貴的開銷,即使sqlserver可以在數毫秒內完成,所以sqlserver會在任何時候盡可能保留並重用計畫以便全面降低開銷。當執行計畫被產生出來後,會存放在乙個叫做計畫快取的記憶體塊中。
當我們提交乙個查詢到伺服器時,algebrizer過程就會建立乙個hash,類似於乙個對於查詢的編碼簽名。這個hash是唯一的,暱稱為查詢指紋(query fingerprint)。每個查詢都有乙個標識,包括所有包含在查詢中的文字,也包含空間及開銷,優化器會對比快取中的hash。如果查詢優化器發現查詢已經快取並匹配,那麼就會跳過整個優化過程並重用執行計畫。
這是sqlserver其中乙個強大之處,它能降低建立計畫的開銷。乙個主要的最佳實踐是編寫能使得sqlserver重用計畫的查詢,為了確保重用,最好是使用儲存過程或者引數化查詢。引數化查詢是在查詢中由引數來識別的變數,類似於儲存過程。
如果變數被硬編碼,那麼字串的改變就變得很少,這將會引起與快取中的計畫不匹配,意味著會使得sqlserver找不到在快取中的計畫,然後優化過程就會觸發並產生新的計畫。通過查詢hash並用於研究效能問題是可行的,詳細內容參考dmos章節。
sqlserver並不永久保留執行計畫在記憶體中。它們會通過系統中的age公式(執行計畫的預估開銷×已經執行的次數)慢慢地aged out,比如執行計畫的預估開銷是10,並且已經執行了5次,那麼age就是50。乙個叫做lazywriter的內部程序,用於釋放所有型別的快取(包括計畫快取),會周期性地掃瞄快取中的物件並每次降低乙個age值。
如果同時下面的條件滿足,計畫就會被移除出記憶體:
l 系統需要更多的記憶體。
l 計畫的age值達到0。
l 該計畫沒有被當前的連線所引用。
l 查詢所引用的表的結構或者架構發生改變。
l 查詢所使用的索引變更了。
l 查詢所使用的索引被刪除。
l 查詢所使用的統計資訊被更新了。
l 呼叫了函式sp_recompile。
l 查詢所引用的表中鍵由於大資料量的插入或刪除而引起統計資訊的改變。
l 對於觸發器,inserted或者deleted表有明顯的增加。
l 在乙個單查詢中混合使用了ddl和dml,通常叫做延遲編譯。
l 在查詢執行過程中set選項的改變。
l 查詢所使用的臨時表的架構或結構發生了改變。
l 查詢所使用的動態檢視發生改變。
l 查詢所使用的游標選項發生改變。
l 改變遠端行集,如在乙個分布式分割槽檢視中。
l 當使用客戶端游標,如果forbrowse選項改變,也會引發重編譯。
第一章 CLR執行模型
發現看過好幾遍還是會忘記,因水平有限理解的不是很到位。歡迎各位大神及時指正。clr執行模型 1.1編譯器將源 編譯成託管模組 託管模組 是標準的windows可移植執行體檔案 pe32 32位機器 或者pe32 64位機器 它們需要clr 才能執行 1.2 編譯器將託管模組合併成程式集 託管模組有四...
python第一章筆記 第一章 基礎
參與除法的兩個數中有乙個數為浮點數,結果也為浮點數 如 1.0 2,1 2.0,1.0 2.0 python print 1.0 2 結果 0.5 print 1 2.0 結果 0.5 print 1.0 2.0 結果 0.5 整數 整數,計算結果的小數部分被截除,只保留整數部分 不會四捨五入 如 ...
第一章 WCF起步 3
size large color red 原文 url size x large color orange wcf和web服務的不同 color size table b 特點 b b web服務 b b wcf b hosting 只能託管在iis中 可以託管在iis,was服務,windows服...