備妥的執行
適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)
ODBC API 會定義備妥的執行方式,以減少與重複執行 Transact-SQL 語句相關聯的剖析和編譯額外負荷。 應用程式會建立一個包含 SQL 陳述式的字元字串,然後在兩個階段執行此字串。 它會呼叫 SQLPrepare 函 式一次,讓語句剖析並編譯為 Database Engine 的執行計畫。 然後它會針對備妥的執行計畫的每個執行呼叫 SQLExecute 。 這樣會省下每次執行時的剖析和編譯負擔。 應用程式通常會使用備妥的執行來重複執行相同且參數化的 SQL 陳述式。
對於大多數的資料庫而言,備妥的執行要比直接執行已執行三次或四次的陳述式更為快速,主要是因為該陳述式只會編譯一次,而直接執行的陳述式則會在每次執行時進行編譯。 備妥的執行也可以讓網路流量減少,因為每次執行該陳述式時,此驅動程式都可以將執行計畫識別碼和參數值 (而非整個 SQL 陳述式) 傳送給資料來源。
SQL Server透過改善的演算法來偵測及重複使用SQLExecDirect的執行計畫,減少直接和備妥執行之間的效能差異。 如此可讓備妥的執行得到的某些效能優點可供直接執行的陳述式使用。 如需詳細資訊,請參閱 直接執行。
SQL Server也提供準備執行的原生支援。 執行計畫建置在 SQLPrepare 上,稍後會在呼叫 SQLExecute 時執行。 因為SQL Server不需要在SQLPrepare上建置暫存程式,所以 tempdb中的系統資料表不會有額外的額外負荷。
基於效能考慮,語句準備會延後,直到呼叫 SQLExecute 或執行 ODBC) 中的 SQLDescribeCol 或 SQLDescribeParam 等中繼屬性 (作業為止。 此為預設行為。 要等到執行此陳述式或執行中繼屬性作業之後,才可得知正在準備之陳述式中的任何錯誤。 將 SQL SERVER NATIVE CLIENT ODBC 驅動程式特定的語句屬性設定為 SQL_SOPT_SS_DEFER_PREPARE,SQL_DP_OFF可以關閉此預設行為。
在延遲準備的情況下,在呼叫SQLExecute之前呼叫SQLDescribeCol或SQLDescribeParam會產生額外的往返伺服器。 在 SQLDescribeCol上,驅動程式會從查詢中移除 WHERE 子句,並將它傳送至具有 SET FMTONLY ON 的伺服器,以取得查詢所傳回之第一個結果集中的資料行描述。 在 SQLDescribeParam上,驅動程式會呼叫伺服器,以取得查詢中任何參數標記所參考之運算式或資料行的描述。 這個方法也有一些限制,例如無法解析子查詢中的參數。
搭配 SQL Server Native Client ODBC 驅動程式使用SQLPrepare會降低效能,特別是在連線到舊版SQL Server時。 備妥的執行不應該用於單次執行的陳述式。 備妥的執行要比直接執行單次執行的陳述式更緩慢,因為它需要從用戶端到伺服器的額外網路往返。 在舊版的 SQL Server也會產生暫時預存程式。
準備陳述式無法用來在 SQL Server 上建立暫存物件。
一些早期 ODBC 應用程式在每次使用SQLBindParameter時都使用了SQLPrepare。 SQLBindParameter 不需要使用 SQLPrepare,可以搭配 SQLExecDirect使用。 例如,使用 SQLExecDirect 搭配 SQLBindParameter ,從只執行一次的預存程式擷取傳回碼或輸出參數。 除非執行相同的語句多次,否則請勿搭配SQLBindParameter使用SQLPrepare。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應