向表 T(X INT) 插入 1,000 筆資料,比較兩種動態 SQL 寫法:
CREATE OR REPLACE PROCEDURE PROC_BIND AS
BEGIN
FOR I IN 1 .. 1000 LOOP
EXECUTE IMMEDIATE 'INSERT INTO T VALUES(:X)' USING I;
END LOOP;
END;
/
CREATE OR REPLACE PROCEDURE PROC_CONCAT AS
BEGIN
FOR I IN 1 .. 1000 LOOP
EXECUTE IMMEDIATE 'INSERT INTO T VALUES(' || I || ')';
END LOOP;
END;
/
| 執行方式 | 耗時(秒) | 相對效能 |
|---|---|---|
綁定變數 PROC_BIND | 0.047 | 基準 (100%) |
字串拼接 PROC_CONCAT | 0.156 | 3.3 倍較慢 |
:X 佔位符)只解析一次,後續複用執行計劃V$SQLAREA 顯示 EXECUTIONS=1000VALUES(1), VALUES(2)...)ORA-04031 (Shared Pool 記憶體不足)-- 查看共享池 SQL 統計
SELECT SQL_TEXT, EXECUTIONS, PARSE_CALLS, LOADS
FROM V$SQLAREA
WHERE SQL_TEXT LIKE 'INSERT INTO T%';
-- 綁定變數版:EXECUTIONS=1000, PARSE_CALLS=1, LOADS=1
-- 拼接版:1000 筆記錄,各 EXECUTIONS=1, PARSE_CALLS=1, LOADS=1
INSERT INTO T VALUES(I))隱含綁定,效能同寫法 1PreparedStatement 對應綁定變數,Statement 對應拼接FORALL + 陣列綁定,效能更強綁定變數不是「優化技巧」,而是「正確寫法」。拼接字串屬於反模式,僅適合極少量、一次性維護腳本。