Oracle 綁定變數的本質是替代 SQL 語句中的常值。它是讓 Oracle 重複利用執行計畫、避免硬解析的唯一機制。掌握綁定變數,是編寫高效能 PL/SQL 與應用程式的關鍵。
當 SQL 送入共用池無完全相同語句時觸發。需經歷語法檢查、語意分析、權限驗證、最佳化器制定執行路徑、生成執行計畫等完整流程。極度消耗 CPU,且佔用關鍵 Latch (閂鎖) 資源,嚴重限制系統擴展性,單純增加記憶體或 CPU 無法根治。
共用池中存在完全相同的 SQL (文字逐字相符),直接複用現有執行計畫,僅做輕量級語法/權限檢查。效能差異可達數十到數百倍。
使用綁定變數 (如 :1, :2 或 :cust_no) 後,無論傳入何種實際數值,SQL 文本永遠保持完全一致。Oracle 即可在共用池精準匹配,實現軟解析複用。
CREATE TABLE t (a VARCHAR2(20), b VARCHAR2(20));
DECLARE
v_sql VARCHAR2(50);
BEGIN
FOR i IN 1..100000 LOOP
v_sql := 'INSERT INTO t VALUES (:1, :2)';
EXECUTE IMMEDIATE v_sql USING 'a'||i, 'b'||i;
END LOOP;
COMMIT;
END;
/
所有 10 萬次插入共用同一個執行計畫,僅軟解析。
DECLARE
BEGIN
FOR i IN 1..100000 LOOP
INSERT INTO t VALUES ('a'||i, 'b'||i);
END LOOP;
COMMIT;
END;
/
每次迴圈產生不同 SQL 文本,觸發 10 萬次硬解析,嚴重拖垮系統。
TRUNCATE TABLE t;
自 10g 全面採用 CBO (成本基礎最佳化) 取代 RBO,綁定變數搭配 CURSOR_SHARING、Adaptive Cursor Sharing (11g)、SQL Plan Baselines (11g) 等特性,效能提升空間遠大於 9i 時代。現代版本更能智慧處理資料歪斜問題。