延遲名稱解析及編譯

建立預存程序時,會剖析程序中陳述式的語法是否正確。如果在程序定義中發現語法錯誤,就會傳回錯誤,而且不會建立預存程序。如果陳述式的語法正確,則會將預存程序的文字儲存在 sys.sql_modules 目錄檢視中。

第一次執行預存程序時,查詢處理器會從 sys.sql_modules 目錄檢視讀取預存程序的文字,並檢查程序所使用的物件名稱是否存在。這個處理程序稱為延緩名稱解析,因為建立預存程序時,它所參考的資料表物件並不必存在,只要執行時存在即可。

[!附註]

在參考不存在的資料表物件時,才能使用「延遲名稱解析」。在建立預存程序時,必須存在所有其他物件。例如,當您在預存程序中參照存在的資料表時,不能列出該資料表不存在的資料行。

在解析階段中,Microsoft SQL Server 也可以執行其他的驗證活動 (例如,檢查資料行資料類型與變數的相容性)。如果在執行預存程序時,預存程序所參考的物件遺失了,當執行到參考遺失物件的陳述式I時,預存程序就會停止執行。在這樣的情況下,或是如果在解析階段中找到錯誤,就會傳回錯誤。

[!附註]

如果已刪除或重新命名預存程序所參考的物件,執行預存程序時就會傳回錯誤。但如果以同名物件取代預存程序中所參考的物件,預存程序就會執行,而不須重新建立。例如,如果預存程序 Proc1 參考資料表 Test1,但已刪除 Test1 且建立了另一個名為 Test1 的資料表,則 Proc1 會參考新資料表。不必重新建立預存程序。

如果程序執行順利通過解析階段,Microsoft SQL Server 的查詢最佳化工具就會分析預存程序中的 Transact-SQL 陳述式,並建立執行計畫。執行計畫中描述執行預存程序最快的方法,所依據的資訊如下:

  • 資料表中的資料量。

  • 資料表有沒有索引,及索引的性質,以及索引行中資料分散的情形。

  • WHERE 子句的條件中所用的比較運算子和比較值。

  • 有沒有聯結與 UNION、GROUP BY 與 ORDER BY 關鍵字。

查詢最佳化工具在分析過預存程序中的這些因素後,就會將執行計畫放在記憶體中。分析預存程序和建立執行計畫的這個處理程序稱為編譯。執行查詢時,就會使用記憶體中最佳化的執行計畫。執行計畫會一直留在記憶體中,直到重新啟動 SQL Server,或別的物件需要儲存空間為止。

以後再執行預存程序時,如果它還在記憶體中,SQL Server 就會重覆使用現有的執行計畫。如果執行計畫已不在記憶體中,則會建立新的執行計畫。