執行計畫重編譯的時機

2021-09-12 10:06:44 字數 2529 閱讀 7849

執行計畫的快取和重新使用

根據資料庫新狀態的不同,資料庫中的某些更改可能導致執行計畫效率降低或無效。sql server 將檢測到使執行計畫無效的更改,並將計畫標記為無效。此後,必須為執行查詢的下乙個連線重新編譯新的計畫。導致計畫無效的情況包括:

對查詢所引用的表或檢視進行更改(alter table 和 alter view)。

對執行計畫所使用的任何索引進行更改。

對執行計畫所使用的統計資訊進行更新,該更新可能是從語句(如 update statistics)中顯示生成,也可能是自動生成的。

刪除執行計畫所使用的索引。

顯式呼叫sp_recompile

對鍵的大量更改(其他使用者對由查詢引用的表使用 insert 或 delete 語句所產生的修改)。

對於帶觸發器的表,插入的刪除的表內的行數顯著增長。

使用 with recompile 選項執行儲存過程。

為了使語句正確,或要獲得可能更快的查詢執行計畫,大多數都需要進行重新編譯。

在 sql server 2000 中,只要批處理中的語句導致重新編譯,就會重新編譯整個批處理,無論此批處理是通過儲存過程、觸發器、即席批查詢,還是通過預定義的語句進行提交。在 sql server 2005 中,只有在批處理中導致重新編譯的語句才會被重新編譯。由於這種差異,sql server 2000 和 sql server 2005 中的重新編譯計數不可比較。另外,由於 sql server 2005 擴充套件了功能集,因此,具有更多重新編譯型別。

語句級重新編譯有助於提高效能,因為在大多數情況下,只有少數語句導致了重新編譯並造成相關損失(指 cpu 時間和鎖)。因此,避免了批處理中其他不必重新編譯的語句的這些損失。

sql server profilersp:recompile跟蹤事件在 sql server 2005 中報告語句級重新編譯。此跟蹤事件在 sql server 2000 中僅報告批處理重新編譯。此外,在 sql server 2005 中,將填充此事件的textdata列。因此,已不再需要 sql server 2000 中必須跟蹤sp:stmtstartingsp:stmtcompleted以獲取導致重新編譯的 transact-sql 文字的做法。

sql server 2005 也新增了乙個新跟蹤事件,稱為sql:stmtrecompile,它報告語句級重新編譯。此跟蹤事件可用於跟蹤和除錯重新編譯。sp:recompile僅針對儲存過程和觸發器生成,而sql:stmtrecompile則針對儲存過程、觸發器、即席批查詢、使用sp_executesql執行的批處理、已準備的查詢和動態 sql 生成。

sp:recompilesql:stmtrecompileeventsubclass列都包含乙個整數**,用以指明重新編譯的原因。下表包含每個**號的意思。

eventsubclass 值

說明架構已更改。

統計資訊已更改。

編譯已延遲。

set 選項已更改。

臨時表已更改。

遠端行集已更改。

for browse 許可權已更改。

查詢通知環境已更改。

分割槽檢視已更改。

游標選項已更改。

已請求 option (recompile)。

當 auto_update_statistics 資料庫選項被設定為 on 時,如果查詢以表或索引檢視為目標,而表或索引檢視的統計資訊自上次執行後已更新或基數已發生很大變化,查詢將被重新編譯。此行為適用於標準使用者定義表、臨時表以及由 dml 觸發器建立的inserteddeleted表。如果過多的重新編譯影響到查詢的效能,請考慮將此設定更改為 off。當 auto_update_statistics 資料庫選項設定為 off 時,不會因統計資訊或基數的更改而發生任何重新編譯,但是,由 dml instead of 觸發器建立的inserteddeleted表除外。因為這些表是在tempdb中建立的,因此,是否重新編譯訪問這些表的查詢取決於tempdb中 auto_update_statistics 的設定。請注意,在 sql server 2000 中,即使此設定為 off,查詢仍然會基於 dml 觸發器inserteddeleted表的基數變化進行重新編譯。有關禁用 auto_update_statistics 的詳細資訊,請參閱

索引統計資訊

。posted @

2012-09-17 12:48

xwdreamer 閱讀(

...)

編輯收藏

執行計畫重編譯的時機

執行計畫的快取和重新使用 根據資料庫新狀態的不同,資料庫中的某些更改可能導致執行計畫效率降低或無效。sql server 將檢測到使執行計畫無效的更改,並將計畫標記為無效。此後,必須為執行查詢的下乙個連線重新編譯新的計畫。導致計畫無效的情況包括 對查詢所引用的表或檢視進行更改 alter table...

測試計畫編寫的時機

可以認為什麼都可以從編制計畫開始,但是測試計畫卻不一定是第乙個。對於測試來說,有乙個測試計畫很重要,可以指導和督促測試任務的實施,但什麼時候開始寫測試計畫呢?我認為,是在對你所要測試的物件有了一定了解之後。測試計畫有乙個測試認務,有乙個測試的截止時間,然後將這個任務在這段時間內有序的,有目的的分攤下...

Finally的執行時機

有人問下面 是return先執行,還是finally先執行.int i 1 tryfinally 很多人都回答是finally先執行,因為他們知道是返回0.但是其實真正意義上來講是return先開始執行的,只是return中間會跳轉到finally 執行,然後再跳轉回來。return的執行 是分兩步...