SQL 存儲過程預編譯
存儲過程的預編譯功能: 存儲過程創建生效時,會編譯緩存一個存儲過程的執行計劃。
存儲過程是一段SQL語句和可選控制流語句的預編譯集合。
預編譯就是緩存一個執行計劃(在存儲過程創建時,查詢優化器對其進行分析、優化,并給出一個最終的執行計劃(存儲在Plane Cache中)。這樣,在執行過程時便可按照這個執行計劃進行查找)。
預編譯主要體現在存儲過程中的復雜查詢語句:每次執行時,不需要每次編譯,直接根據預編譯的執行計劃進行查找。
但是有時存儲過程中某些復雜的查詢語句發生“變化”(數據發生量級變化,結構、索引等發生變化),這時根據預編譯的執行計劃并不能達到最優查找的目的,
那么就需要指明該復雜的SQL語句在執行時重新選取最優路徑(重新通過查詢分析器分析,找出最優查找路徑)。
根本原因分析:
存儲過程預編譯問題。
所謂預編譯,是指在存儲過程創建時,查詢優化器對其進行分析、優化,給出并緩存一個最終的執行計劃。
在存儲過程每次執行時,不需要再次編譯,而是根據這個預編譯的執行計劃進行查找,來提高查詢性能。
但是有時存儲過程中某些查詢語句中相關的表和數據發生”變化“(例如:數據發生量級變化,相關表結構、索引等發生變化),
造成執行計劃準確度問題(即不是最優的查找路徑)。這時再根據先前預編譯的執行計劃不能達到最優的查找目的,反而造成查詢耗時增大。
舉個例子:比如一本每天更新的材料。在第一次定稿時,我們編排了每個章節在哪一頁這樣的目錄。
但是因為持續更新,有一天可能對之前的章節有刪減(這樣之前的目錄就不準確了),造成根據之前編排的目錄并不能準確定位要找的信息,反而增加了查找時間。
解決辦法:
通過在查詢語句后面指定 “OPTION (OPTIMIZE FOR UNKNOWN)”,來生成一個穩定、統一的執行計劃。
“OPTIMIZE FOR UNKNOWN” 指示查詢優化器在查詢優化期間使用統計數據而不是初始值來確定局部變量的值,
這些值僅用于查詢優化期間,而不會用于查詢執行期間。
通俗的理解就是:在運行存儲過程中,發現某個查詢SQL耗時較長時,則不按照預先的執行計劃查找,而是通過分析統計數據來確定查找路徑;
對于按預先的執行計劃查找順利的SQL,仍然按照預編譯的執行計劃進行查找。

浙公網安備 33010602011771號