共用方式為


準備指令

SQL Server Native Client OLE DB 提供者支援命令準備,以優化單一命令的多個執行;不過,命令準備會產生額外負荷,取用者不需要準備命令以多次執行命令。 一般而言,如果命令將執行超過三次,則應該備妥命令。

基於效能考慮,命令準備會延後,直到執行命令為止。 此為預設行為。 在命令執行或執行中繼屬性作業之前,才知道正在準備的命令中的任何錯誤。 將 SQL Server 屬性SSPROP_DEFERPREPARE設定為 FALSE 可以關閉此預設行為。

在 SQL Server 中,當命令直接執行時(不需要先準備命令),就會建立並快取執行計劃。 如果再次執行 SQL 語句,SQL Server 就會有一個有效率的演算法來比對快取中的現有執行計劃,並重複使用該語句的執行計劃。

針對備妥的命令,SQL Server 提供準備和執行命令語句的原生支援。 當您準備語句時,SQL Server 會建立執行計劃、快取它,並將此執行計劃的句柄傳回給提供者。 提供者接著會使用此句柄重複執行 語句。 不會建立任何預存程式。 因為句柄會直接識別 SQL 語句的執行計劃,而不是比對快取中的執行計劃(如同直接執行的情況),所以準備語句比直接執行更有效率,如果您知道語句會執行多次。

在 SQL Server 2005 中,備妥的 語句無法用來建立暫存物件,而且無法參考建立暫存對象的系統預存程式,例如臨時表。 這些程序必須直接執行。

一些命令不應該準備好。 例如,指定預存程式執行或包含無效文字的 SQL Server 預存程式建立的命令不應該備妥。

如果已建立暫存程式,SQL Server Native Client OLE DB 提供者會執行暫存程式,並傳回結果,就像執行語句本身一樣。

暫存程式建立是由 SQL Server Native Client OLE DB 提供者所控制,-specific 初始化屬性SSPROP_INIT_USEPROCFORPREP。 如果屬性值是SSPROPVAL_USEPROCFORPREP_ON或SSPROPVAL_USEPROCFORPREP_ON_DROP,SQL Server Native Client OLE DB 提供者會在準備命令時嘗試建立預存程式。 如果應用程式使用者有足夠的 SQL Server 許可權,預存程式建立就會成功。

對於不常中斷連線的取用者,建立暫存程式可能需要 tempdb的重要資源,也就是建立暫存物件的SQL Server系統資料庫。 當 SSPROP_INIT_USEPROCFORPREP 的值SSPROPVAL_USEPROCFORPREP_ ON 時,只有在建立命令的會話失去與 SQL Server 實例的連線時,才會卸除 SQL Server Native Client OLE DB 提供者所建立的暫存程式。 如果該連接是在數據源初始化上建立的默認連接,則只有在數據源變成未初始化時,才會卸除暫存程式。

當SSPROP_INIT_USEPROCFORPREP的值SSPROPVAL_USEPROCFORPREP_ON_DROP時,當發生下列其中一項時,會卸除 SQL Server Native Client OLE DB 提供者暫存程式:

  • 取用者會使用 ICommandText::SetCommandText 來指出新的命令。

  • 取用者會使用 ICommandPrepare::Unprepare 表示不再需要命令文字。

  • 取用者會使用暫存程序釋放命令物件的所有參考。

命令物件在 tempdb中最多有一個暫存程式。 任何現有的暫存程式都代表特定命令物件的目前命令文字。

另請參閱

命令