本文為《Oracle PL/SQL 應用程式效能調優》第十二章核心內容的結構化摘要,配合原書圖表說明,涵蓋 PL/SQL 執行架構、SQL 引擎互動、大量資料處理模式、快取機制、剖析工具與實戰優化模式,適合快速複習與查閱。
| 主題 | 核心觀念 | 關鍵技術/工具 |
|---|---|---|
| PL/SQL 執行架構 | PL/SQL 引擎處理程序邏輯,SQL 陳述式移交 SQL 引擎,上下文切換有開銷 | 上下文切換、BULK COLLECT/FORALL 減少切換 |
| SQL 陳述式優化 | 執行計畫分析、索引存取路徑、聯接方法 (NL/HASH/MERGE)、統計資訊 | EXPLAIN PLAN, DBMS_XPLAN, SQL Tuning Advisor |
| 大量資料處理 | 游標 FOR LOOP vs BULK COLLECT/FORALL、LIMIT 子句控制記憶體 | BULK COLLECT INTO, FORALL SAVE EXCEPTIONS |
| 快取與記憶體 | 共用池、Library Cache、Data Dictionary Cache、PGA 工作區 | V$SGASTAT, V$LIBRARYCACHE, PGA_AGGREGATE_TARGET |
| 剖析與診斷 | SQL Trace (10046)、TKPROF、DBMS_PROFILER、DBMS_HPROF (階層式) | 事件 10046, TRCSESS, tkprof, plprof |
| 鎖與併發 | 行鎖 (TX)、表鎖 (TM)、死偵測、ITL 等待、應用層鎖 (DBMS_LOCK) | V$LOCK, V$SESSION_WAIT, DBA_BLOCKERS |
| 實戰優化模式 | 將行級邏輯集合化、減少硬解析、綁定變數、避免隱性轉換 | BULK BIND, CURSOR_SHARING=FORCE, 程式碼重構 |
-- ❌ 慢:逐列處理,頻繁上下文切換
FOR rec IN (SELECT * FROM big_table) LOOP
UPDATE other_table SET col = rec.val WHERE id = rec.id;
END LOOP;
-- ✅ 快:批次收集 + 批次更新,單次上下文切換
DECLARE
TYPE id_arr IS TABLE OF NUMBER;
TYPE val_arr IS TABLE OF VARCHAR2(100);
l_ids id_arr; l_vals val_arr;
BEGIN
SELECT id, val BULK COLLECT INTO l_ids, l_vals FROM big_table;
FORALL i IN 1..l_ids.COUNT SAVE EXCEPTIONS
UPDATE other_table SET col = l_vals(i) WHERE id = l_ids(i);
END;
-- ✅ 避免隱性轉換導致索引失效
WHERE date_col = TO_DATE(:bind_var, 'YYYY-MM-DD') -- 明確轉換
WHERE num_col = TO_NUMBER(:bind_var) -- 明確轉換
| 工具 | 啟用方式 | 輸出分析 |
|---|---|---|
| SQL Trace (10046) | `ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';` | .trc 檔 → tkprof sys_ora_123.trc out.txt explain=user/pass sort=exeela,fchela |
| DBMS_PROFILER | `DBMS_PROFILER.START_PROFILER('Run1');` ... `STOP_PROFILER;` | 查詢 `PLSQL_PROFILER_RUNS/DATA/UNITS` 表獲取逐行耗時 |
| DBMS_HPROF (11g+) | `DBMS_HPROF.START_PROFILING('DIR', 'run1.trc');` ... `STOP_PROFILING;` | `plprof` 工具生成 HTML 階層報表,含呼叫樹、耗時分佈 |
| SQL Monitoring (11g+) | 自動監控長跑 SQL (>5秒),查詢 `V$SQL_MONITOR` | Enterprise Manager / `DBMS_SQLTUNE.REPORT_SQL_MONITOR` |
SHARED_POOL_SIZE / SGA_TARGET:Library Cache、Dictionary Cache 容量PGA_AGGREGATE_TARGET:排序、雜湊、位圖建立工作區CURSOR_SHARING = FORCE | EXACT:強制/精確綁定變數化 (謹慎用 FORCE)SESSION_CACHED_CURSORS:會話級游標快取數量建議配合原書完整程式碼範例與圖表研讀,並至實際資料庫環境實驗各剖析工具,將理論內化為診斷直覺。