ODBC 中的動態 SQL 效能

雖然靜態 SQL 在許多情況下運作良好,但有一個類別的應用程式無法事先判斷資料存取。 例如,假設試算表允許使用者輸入查詢,然後試算表會傳送至 DBMS 以擷取資料。 撰寫試算表程式時,程式設計人員顯然無法知道此查詢的內容。

動態執行

為了解決此問題,試算表會使用稱為動態 SQL 的內嵌 SQL 形式。 與程式硬式編碼的靜態 SQL 陳述式不同,動態 SQL 陳述式可在執行階段建置,並放在字串主機變數中。 然後,系統會將它們傳送至 DBMS 進行處理。 因為 DBMS 必須在執行階段產生動態 SQL 陳述式的存取計畫,所以動態 SQL 通常比靜態 SQL 慢。 編譯包含動態 SQL 陳述式的程式時,動態 SQL 陳述式不會從程式中移除,如同在靜態 SQL 一樣。 相反地,將陳述式傳遞至 DBMS 的函式呼叫會取代它們;相同程式中的靜態 SQL 陳述式會正常處理。

執行動態 SQL 陳述式最簡單的方式是使用 EXECUTE IMMEDIATE 陳述式。 此陳述式會將 SQL 陳述式傳遞至 DBMS 以進行編譯和執行。

EXECUTE IMMEDIATE 陳述式的其中一個缺點是 DBMS 必須在每次執行陳述式時,執行處理 SQL 陳述式的五個步驟中每一個步驟。 如果動態執行許多陳述式,涉及此處理序的額外負荷可能會很重要,而且如果這些陳述式類似,則會造成浪費。

備妥的執行

為了解決上述情況,動態 SQL 提供稱為備妥執行的最佳化執行形式,會使用下列步驟:

  1. 程式會在緩衝區中建構 SQL 陳述式,就像為 EXECUTE IMMEDIATE 陳述式建置的一樣。 與主機變數不同,問號 (?) 可在陳述文本的任何地方替代常數,表示稍後將提供常數的值。 問號稱為參數標記。

  2. 程式會使用 PREPARE 陳述式將 SQL 語句傳遞至 DBMS,它會要求 DBMS 剖析、驗證及最佳化陳述式,並為其產生執行計畫。 然後,程式稍後會使用 EXECUTE 陳述式 (而非 EXECUTE IMMEDIATE 陳述式) 執行 PREPARE 陳述式。 它會透過稱為 SQL 資料區或 SQLDA 的特殊資料結構,傳遞陳述式的參數值。

  3. 程式可以重複使用 EXECUTE 陳述式,每次執行動態陳述式時,都會提供不同的參數值。

備妥的執行仍然與靜態 SQL 不同。 在靜態 SQL 中,處理 SQL 陳述式的前四個步驟是在編譯時間進行。 在備妥的執行中,這些步驟仍會在執行階段進行,但只會執行一次。 只有在呼叫 EXECUTE 時,才會執行計畫。 此行為有助於消除動態 SQL 結構中固有的一些效能缺點。

另請參閱

EXECUTE (Transact-SQL)
sp_executesql (Transact-SQL)