Oracle PL/SQL 預設採用解釋執行 (INTERPRETED),11g+ 支援原生編譯 (NATIVE) 將 PL/SQL 編譯為 C 程式碼再編譯為共享庫,理論上可提升 CPU 密集型運算效能。本文記錄實測流程:建立測試表/程序、對比解釋 vs 原生模式執行時間、Session/系統級開啟方式、相關參數說明。
-- 測試表
CREATE TABLE t1 (rid NUMBER);
CREATE TABLE t_n (rid NUMBER);
-- 測試程序:插入 100 萬筆資料
CREATE OR REPLACE PROCEDURE pro_xcl(p1 VARCHAR2) IS
BEGIN
DBMS_OUTPUT.PUT_LINE(p1);
INSERT INTO t1 SELECT ROWNUM FROM DUAL CONNECT BY ROWNUM < 1000000;
COMMIT;
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE || ' : ' || SUBSTR(SQLERRM, 200));
END;
| 編譯模式 | 切換指令 | 執行時間 | 提升幅度 |
|---|---|---|---|
| INTERPRETED (預設) | — | 4.68 秒 | 基準 |
| NATIVE | ALTER PROCEDURE pro_xcl COMPILE PLSQL_CODE_TYPE=NATIVE; | 4.09 秒 | ~12% (0.6 秒) |
結論:此測試場景 (大量 INSERT) 提升有限,因瓶頸在 I/O 與 Redo 產生,而非 PL/SQL 引擎解析。原生編譯主要加速純計算邏輯 (迴圈、數學運算、字串處理)。
-- 1. 單一物件 (立即生效)
ALTER PROCEDURE pro_xcl COMPILE PLSQL_CODE_TYPE=NATIVE;
ALTER FUNCTION func_xcl COMPILE PLSQL_CODE_TYPE=NATIVE;
ALTER PACKAGE pkg_xcl COMPILE PLSQL_CODE_TYPE=NATIVE;
ALTER PACKAGE BODY pkg_xcl COMPILE PLSQL_CODE_TYPE=NATIVE;
ALTER TRIGGER trg_xcl COMPILE PLSQL_CODE_TYPE=NATIVE;
ALTER TYPE type_xcl COMPILE PLSQL_CODE_TYPE=NATIVE;
-- 2. Session 級 (當前連線新建物件預設為 NATIVE)
ALTER SESSION SET PLSQL_CODE_TYPE=NATIVE;
-- 3. 系統級 (全庫新建物件預設為 NATIVE,需重啟或重新編譯既有物件)
ALTER SYSTEM SET PLSQL_CODE_TYPE=NATIVE SCOPE=SPFILE; -- 需重啟
-- 或
ALTER SYSTEM SET PLSQL_CODE_TYPE=NATIVE SCOPE=BOTH; -- 立即生效 (僅影響後續編譯)
SELECT plsql_code_type FROM all_plsql_object_settings WHERE name = 'PRO_XCL';
-- 結果: INTERPRETED 或 NATIVE
SHOW PARAMETER plsql
NAME TYPE VALUE
plsql_ccflags string
plsql_code_type string INTERPRETED -- 關鍵參數
plsql_debug boolean FALSE
plsql_optimize_level integer 2 -- 優化等級 0~3
plsql_v2_compatibility boolean FALSE
plsql_warnings string DISABLE:ALL
PLSQL_OPTIMIZE_LEVEL=2 (預設) 已包含中度優化,原生編譯可視為極致優化PLSQL_DEBUG=TRUE 會強制回退至 INTERPRETED,不相容| 適用場景 | 不適用/風險場景 |
|---|---|
| 大量數學運算、複雜演算法、字串解析 | 以 SQL/DML 為主的業務邏輯 (瓶頸在引擎外) |
| 批次計算程序、報表產生器 | 頻繁修改的程式碼 (原生編譯需 C 編譯器、時間較長) |
| CPU 密集型 PL/SQL 邏輯 | Windows 平台需安裝 Visual Studio / C 編譯器 |