共用方式為


備妥的執行

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

ODBC API 會將備妥的執行定義為減少與重複執行 Transact-SQL 語句相關聯的剖析和編譯額外負荷的方式。 應用程式會建置包含 SQL 語句的字元字串,然後在兩個階段中執行。 它會呼叫 SQLPrepare 函式一次,讓語句剖析並編譯成 資料庫引擎 的執行計劃。 然後它會針對備妥的執行計劃的每個執行呼叫 SQLExecute 。 這樣可節省每次執行的剖析和編譯額外負荷。 準備的執行通常由應用程式用來重複執行相同的參數化 SQL 語句。

對大部分資料庫而言,準備的執行速度比直接執行語句快三或四次以上,主要是因為語句只會編譯一次,而每次執行語句時直接執行的語句都會編譯。 備妥的執行也可以減少網路流量,因為驅動程式可以在每次執行語句時,將執行計劃標識碼和參數值,而不是整個SQL語句傳送至數據源。

SQL Server 可透過改善的演算法,從 SQLExecDirect 偵測及重複使用執行計畫,減少直接執行與備妥執行之間的效能差異。 這讓備妥的執行有一些效能優點可供直接執行的語句使用。 如需詳細資訊,請參閱 直接執行

SQL Server 也針對備妥的執行提供原生支援。 執行計劃建置在 SQLPrepare 上,並在呼叫 SQLExecute執行。 由於 SQL Server 不需要在 SQLPrepare建置暫存程式,因此 tempdb 中的系統數據表不會有額外的額外負荷。

基於效能考慮,語句準備會延後,直到 呼叫 SQLExecute 或執行中繼屬性作業(例如 ODBC 中的 SQLDescribeColSQLDescribeParam )。 此為預設行為。 在執行語句或執行中繼屬性作業之前,都不知道正在準備的語句中發生的任何錯誤。 將 SQL Server Native Client ODBC 驅動程式特定的語句屬性SQL_SOPT_SS_DEFER_PREPARE設定為SQL_DP_OFF可以關閉此預設行為。

如果準備延遲,請在呼叫 SQLExecute 之前呼叫 SQLDescribeColSQLDescribeParam,會產生額外的往返伺服器。 在 SQLDescribeCol 上,驅動程式會從查詢中移除 WHERE 子句,並將它傳送至具有 SET FMTONLY ON 的伺服器,以取得查詢所傳回之第一個結果集中數據行的描述。 在 SQLDescribeParam 上,驅動程式會呼叫伺服器,以取得查詢中任何參數標記所參考之運算式或數據行的描述。 這個方法也有一些限制,例如無法在子查詢中解析參數。

搭配 SQL Server Native Client ODBC 驅動程式過度 使用 SQLPrepare 會降低效能,尤其是在連線到舊版 SQL Server 時。 備妥的執行不應該用於單次執行的陳述式。 備妥的執行速度比單一執行語句的直接執行速度慢,因為它需要從用戶端到伺服器的額外網路往返。 在舊版的 SQL Server 上,它也會產生暫存程式。

備妥的語句無法用來在 SQL Server 上建立暫存物件。

一些早期 ODBC 應用程式在每次使用 SQLBindParameter都使用了 SQLPrepareSQLBindParameter 不需要使用 SQLPrepare,它可以與 SQLExecDirect 搭配使用。 例如,使用 SQLExecDirect 搭配 SQLBindParameter ,從只執行一次的預存程式擷取傳回碼或輸出參數。 請勿搭配 SQLBindParameter 使用 SQLPrepare,除非執行相同的語句多次。

另請參閱

執行語句 (ODBC)