共用方式為


在 SQL Server Native Client 中準備命令

適用於: SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW)

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

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

在 SQL Server 中,直接執行命令 (不事先加以準備) 時,會建立並快取執行計畫。 如果再次執行了 SQL 陳述式,SQL Server 就會有高效的演算法可比對新的陳述式與快取中的現有執行計畫,然後對該陳述式重複使用此執行計畫。

對於經過準備的命令,SQL Server 會提供準備和執行命令陳述式的原生支援。 當您準備陳述式時,SQL Server 會建立執行計畫、快取此計畫,並將此執行計畫的控制代碼傳回給提供者。 然後,提供者會使用此控制代碼來重複執行陳述式。 此時,系統不會建立任何預存程序。 因為句柄會直接識別 SQL 語句的執行計劃,而不是比對快取中的執行計劃(就像直接執行的情況一樣),所以準備語句比直接執行更有效率,如果您知道語句會執行多次。

在 SQL Server 2005 (9.x) 中,經過準備的陳述式無法用來建立暫存物件,且無法參考建立暫存物件 (例如暫存資料表) 的系統預存程序。 這些程序必須直接執行。

您永遠都不應該準備某些命令。 例如,命令若是用來指定預存程序執行,或包含不適用於 SQL Server 預存程序建立的文字,則不應準備。

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

暫存程式建立是由 SQL Server Native Client OLE DB 提供者特定初始化屬性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 中具有一個暫存預存程序。 任何現有的暫存預存程序都代表特定命令物件的目前命令文字。

另請參閱

命令