面對百萬級大表 Hash Join 耗時 19 分鐘,透過並行查詢 (PARALLEL Hint) 結合多核 CPU,將執行時間壓縮至 **20 秒**,Consistent Gets 降低一個數量級。本文完整記錄優化過程與關鍵參數調整。
SELECT COUNT(ui.usin_uid_fk)
FROM table1 av, table2 ui
WHERE av.av_usse_activatedate >= TO_DATE('20090102','YYYYMMDD')
AND av.av_usse_activatedate < TO_DATE('20090401','YYYYMMDD')
AND av.av_usse_uid_fk = ui.usin_uid_fk
AND ui.usin_mcnc_fk = 'XXX%';
SELECT /*+ PARALLEL(ui, 4) */ COUNT(ui.usin_uid_fk)
FROM table1 av, table2 ui
WHERE ... (同上)
SELECT /*+ PARALLEL(ui, 8) */ COUNT(ui.usin_uid_fk) ...
PARALLEL_DEGREE_POLICY=AUTO (11gR2+) 讓 Oracle 自動依物件大小與 CPU 核心數決定;手動指定建議 **等於 CPU 核心數** (非超執行緒數)。V$PX_SESSION, V$SQL_WORKAREA_ACTIVE 避免資源耗盡影響其他業務。PARALLEL_MAX_SERVERS, PARALLEL_MIN_SERVERS, PGA_AGGREGATE_TARGET 需配合負載規劃。
EXPLAIN PLAN FOR SELECT /*+ PARALLEL(ui, 8) */ ...;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- 關鍵字:PX SEND, PX RECEIVE, PX BLOCK ITERATOR, HASH JOIN BUFFERED