Share via


準備SQL Server Native Client中的命令

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics 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,則 OLE DB 提供者SQL Server Native Client會在準備命令時嘗試建立預存程式。 如果應用程式使用者具有足夠的 SQL Server 權限,預存程序建立就會成功。

若為不常中斷連線的取用者,建立暫存預存程序可能會需要 tempdb (在其中建立暫存物件的 SQL Server 系統資料庫) 的大量資源。 當 SSPROP_INIT_USEPROCFORPREP 的值SSPROPVAL_USEPROCFORPREP_ ON 時,只有在建立命令的會話失去與 SQL Server 實例的連接時,才會卸載SQL Server Native Client OLE DB 提供者所建立的暫時預存程式。 如果該連接是針對資料來源初始化所建立的預設連接,只有當資料來源成為未初始化時,才會卸除暫存預存程序。

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

  • 取用者使用 ICommandText::SetCommandText 來表示新的命令。

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

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

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

另請參閱

命令