Stored-Procedures

為什麼要更新儲存過程?

  • August 26, 2020

是否有重要的理由重新編譯儲存過程?

當然,數據庫中的數據會隨著時間而變化,並且某些儲存過程的結果集可能會因基礎數據的變化而有所不同。但是除非表結構發生變化,否則儲存過程應該永遠是好的嗎?

我說的是 Sybase ASE 15。

數據庫中的數據隨時間變化

這是通常的原因。雖然編譯儲存過程的概念是特定於實現的,但它通常涉及為過程和/或形成它的各個語句生成查詢計劃,並將其儲存以供以後重用(以保存該部分過程在每次重複呼叫該過程的時間)。

隨著數據的增長,每個表/索引中的數據平衡可能會發生變化,使得上次編譯過程時的最佳計劃現在比其他選項效率低得多,因此過程將不再像它一樣執行可以。例如,如果在創建(或上次編譯)過程時表中只有幾行,則掃描可能比一次或多次搜尋更有效,但以後可能不再如此。此外,首先觸摸哪個索引最有效可能會隨著時間的推移而變化,特別是對於寬表上的查詢和連接多個表的查詢。

數據庫引擎通常會內置一些啟發式算法,以在大量數據更改以及結構更改後導致重新編譯,但這些算法通常在操作上非常保守,因此有時需要手動啟動重新編譯。與決定何時對索引統計直方圖重新採樣所涉及的啟發式方法非常相似(通常會在查詢計劃決策和儲存過程中提供這些資訊)。

有時帶有參數的 procs 需要不同的計劃才能對不同的輸入有效 - 有時在某些情況下總是重新編譯是有益的,因為差異如此之大以至於您不想冒險使用慢速記憶體計劃(在 MS SQL ServerWITH RECOMPILE提示用於處理此類情況,或者OPTION (RECOMPILE)用於更細粒度方法的每個語句)。足夠複雜以至於這是一個主要問題的程序通常是“程式碼異味”,這意味著您的設計需要調整,儘管它們並不總是很容易避免。

重新編譯儲存過程、函式、視圖和其他程式對象的最後一個原因是,當其他地方的更改以破壞依賴性檢查的方式進行時,這意味著在實際需要時不會發生自動重新編譯。例如:

  1. 您有一個使用表格視圖的過程。
  2. 有人丟棄並重新創建視圖(而不是使用ALTER VIEW)。

依賴資訊 proc->view 現在失去了。 3. 表已更改。

由於依賴鏈被破壞,引擎不知道過程中的語句可能需要重新編譯,這意味著過程可能開始完全失敗或給出不正確的結果。 4. 重新編譯(在此階段或重新創建視圖之後)可以解決此問題。

引用自:https://dba.stackexchange.com/questions/274308