「針對即席工作負荷進行優化」如何影響你的計畫快取

2021-09-22 07:35:50 字數 1291 閱讀 1388

每次你提交乙個查詢給sql server,sql server檢查計畫快取來看看是否有現存的快取計畫可供重用。sql server對提交的sql語句計算雜湊值,並用這個雜湊值在計畫快取裡檢查現存的執行計畫(實際或更複雜,因為其他的選項——例如set選項——也會影響執行計畫重用)。

如果快取的計畫找到,執行計畫會重用。不然的話新的執行計畫會通過查詢優化器編譯,最後放入計畫作為後期重用。現在假設有下列寫的很爛的c#應用程式。

1

for (int i = 1; i <= 10000; i++)

2

這個程式在loop迴圈裡呼叫了1000次select語句——使用硬編碼引數值。使用硬編碼引數值,sql語句的雜湊值總會不一樣,因此sql server不能重用快取的計畫。作為***,你在計畫快取裡儲存了1000個不同的執行計畫。

每個執行計畫也會占用一些記憶體(在這裡是16kb),因此你浪費了近160m的計畫快取!假設現在你不能修改你程式的實現方法,你還是要提高sql server裡計畫快取的記憶體占用。這就要用到「針對即席工作負荷進行優化」伺服器配置選項。

這個伺服器配置選項自sql server 2008後就引入了,它用來改變sql server快取和重用執行計畫方式。一旦你啟用這個配置選項,sql server並不再真正快取你的整個執行計畫。sql server只儲存所謂的編譯計畫存根(compiled plan stub)。在sql server 2014上,對你的sql語句,存根值是352 bytes的雜湊值。

這樣的話對於10000個提交的sql語句現在我們在計畫快取裡只需要7mb的記憶體。這和剛才的160mb相比已經是巨大的區別!使用這個存根值,sql server現在能記住先前執行的特定sql語句。

現在當你再次執行同一sql語句是,sql server在執行計畫裡找存根值,再次編譯你的執行計畫,最後在計畫快取裡儲存完整執行計畫結果。因此當sql語句被執行至少2次時,這個執行計畫才會被快取。sql語句只執行一次的話(即席sql語句),在計畫快取裡只需要352 bytes。

在這篇文章裡我向你展示了乙個非常簡單的方法來處理對於寫得很糟的應用程式,它用不同的不能重用的執行計畫汙染你的計畫快取。

針對即席工作負荷進行優化」伺服器配置選項也是我經常建議預設啟用的。它會他來計畫快取更好的記憶體管理。

***是你引入的輕量的cpu負擔,因為每個執行計畫必須編譯2次才會儲存在計畫快取裡。當一般來說對於這個額外編譯,你應該有足夠的cpu可用空間。

針對測試報告進行針對性優化

在壓力測試發現問題以後,就要進行有針對性的優化。對於不同的系統,這個過程的策略並不是確定的,但是大概可以劃分為以下幾個步驟 1.定位效能瓶頸,找出系統存在的問題 不同系統的特點不同,在效能瓶頸上也有不同的表現,一般來說,下面的幾個方面通常存在比較大的優化空間 1 磁碟i o及檔案操作 由於磁碟i o...

如何針對企業站首頁進行搜尋優化

隨著電子商務的普及,越來越多的企業都認識到了網路推廣和營銷的重要性,當然,第一步就是給企業做乙個企業 但是很多企業認為做乙個 就是要把公司的產品統統放上去,客戶就會不請自來,從沒有考慮對 進行搜尋優化,從而導致 做好後也是無人問津,我們知道 首頁在搜尋引擎裡快照更新越快越好,更新的頻率 數量 質量和...

針對快閃儲存器進行優化不是空話

人們為什麼對快閃儲存器那麼熱衷?毫無疑問是為了追求更高的效能。emc xtremio首席技術官任宇翔表示,如果過於強調快閃儲存器的高效能,就很容易陷入 高成本 高效能 的誤區,從而束縛了快閃儲存器的應用。從企業級應用來看,人們配置快閃儲存器主要還是為了構建更高速 更敏捷和更簡單的虛擬資料中心。使用者...