sqlserver2005預編譯

zhouwf0726發表於2019-05-02
sqlserver2005預編譯

自動引數化是一個過程,SQL Server 通過這個過程將出現在 SQL 語句中的文字常量替換為諸如 @p1 和 @p2 等引數。然後,SQL 語句的已編譯計劃以引數化的形式被快取在計劃快取中,以便後續的語句(只是在文字常量的值上有所不同)可重用已快取的計劃。正如第四部分所提到的,只有引數值不影響查詢計劃選擇的 SQL 語句才會被自動引數化。

SQL Server 的 LPE(語言處理和執行)元件可引數化 SQL 語句。當發現文字常量的值不影響查詢計劃選擇時,QP(查詢處理器)元件將宣告 LPE 的自動引數化嘗試是“安全的”,並繼續執行自動引數化;否則,將宣告自動引數化是“不安全的”,並將其中止。在第 11.5 節提到的一些效能計數器的值(‘SQLServer:SQL 統計’類別)報告了有關自動引數化的統計資訊。

下方列表列舉了 SQL Server 2005 對其進行自動引數化的語句型別。

帶有 IN 子句的查詢不會被自動引數化。例如:

WHERE ProductID IN (707, 799, 905)

BULK INSERT 語句。

帶有一個含變數的 SET 子句的 UPDATE 語句。例如:

UPDATE Sales.Customer 
SET CustomerType = N'S' 
WHERE CustomerType = @a

帶有 UNION 的 SELECT 語句。

帶有 INTO 子句的 SELECT 語句。

帶有 FOR BROWSE 子句的 SELECT 或 UPDATE 語句。

帶有使用 OPTION 子句指定的查詢提示的語句

其 SELECT 列表包含 DISTINCT 的 SELECT 語句。

帶有 TOP 子句的語句。

WAITFOR 語句。

帶有 FROM 子句的 DELETE 或 UPDATE 語句。

當 FROM 子句含有下列之一時:

多個表

TABLESAMPLE 子句

表值函式或表值變數

全文表

OPENROWSET

XMLUNNEST

OPENXML

OPENQUERY

IROWSET

OPENDATASOURCE

表提示或索引提示

當 SELECT 查詢包含一個子查詢時

當 SELECT 語句包含 GROUP BY、HAVING 或 COMPUTE BY 時

用 WHERE 子句中的 OR 加入的表示式。

expr <> non-null-constant 形式的比較謂詞。

全文謂詞。

當 INSERT、UPDATE 或 DELETE 中的目標表是一個表值函式時。

通過 EXEC 字串提交的語句。

通過 sp_executesqlsp_preparesp_prepexec 提交的語句,不帶有在 TF 447 下自動引數化的引數。

當要求查詢通知時。

當查詢包含通用表表示式列表時。

當查詢包含 FOR UPDATE 子句時。

當 UPDATE 包含 ORDER BY 子句時。

當查詢包含 GROUPING 子句時。

形式如下的 INSERT 語句:INSERT INTO T DEFAULT VALUES。

INSERT ...EXEC 語句。

當查詢包含兩個常量的對比時。例如:

WHERE 20 > 5

通過自動引數化,可建立超過 1000 個引數。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/756652/viewspace-242524/,如需轉載,請註明出處,否則將追究法律責任。

相關文章