當核心 SQL 執行計畫因統計資訊變動而惡化,導致效能劇烈波動時,Stored Outline(預存大綱) 能以 Hints 形式鎖定最佳計畫,提供穩定效能保障。本文詳細解析 Outline 建立、啟用、私有大綱編輯、Hints 注入與統計資訊管理全流程。
確認模式:SHOW PARAMETER optimizer_mode,應為 ALL_ROWS 或 FIRST_ROWS_n。
OUTLN schemaCATEGORY 區分環境(如 PROD、TEST),預設為 DEFAULTALTER SESSION SET CREATE_STORED_OUTLINES = 'PROD_CAT';
該 Session 後續執行的所有 SQL 皆會自動生成 Outline 至指定 Category。
CREATE OR REPLACE OUTLINE ol_co_cl_join
FOR CATEGORY PROD_CAT
ON
SELECT co.crs_id, cl.class_name
FROM courses co, classes cl
WHERE co.crs_id = cl.crs_id;
ALTER SESSION SET USE_STORED_OUTLINES = 'PROD_CAT';
或資料庫層級:ALTER SYSTEM SET USE_STORED_OUTLINES = 'PROD_CAT';
-- 建立私有大綱
ALTER SESSION SET USE_PRIVATE_OUTLINES = TRUE;
-- 編輯私有大綱(透過 DBMS_OUTLN_EDIT)
-- 發布
EXEC DBMS_OUTLN_EDIT.PUBLICIZE_OUTLINE('OL_CO_CL_JOIN');
無需 Outline 機制,單一 SQL 即時生效:
CREATE INDEX gen_idx ON customers(cust_gender);
SELECT /*+ INDEX(customers gen_idx) */
cust_last_name, cust_street_address, cust_postal_code
FROM sh.customers
WHERE UPPER(cust_gender) = 'M';
常用 Hints:INDEX、FULL、LEADING、USE_NL/HASH/MERGE、OPT_PARAM。
@$ORACLE_HOME/rdbms/admin/utlxplan.sqlEXPLAIN PLAN FOR SELECT ...SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); 或執行 utlxplp.sql(含平行查詢資訊)| 方法 | 指令範例 | 適用場景 |
|---|---|---|
| 精確統計 | ANALYZE TABLE t COMPUTE STATISTICS; | 小表、關鍵表、需精確選擇率 |
| 抽樣估計 | ANALYZE TABLE t ESTIMATE STATISTICS SAMPLE 20 PERCENT; | 大表、窗口期有限 |
| DBMS_STATS(推薦) | EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT','EMP',METHOD_OPT=>'FOR ALL COLUMNS SIZE AUTO'); | 生產環境標準化作業、支援直方圖 |