Oracle 10g 引入 Advisory Framework,其中 SQL Access Advisor (Access Advisor) 可自動分析工作負載,推薦索引與物化視圖建立/刪除建議。10gR2 新增 DBMS_ADVISOR.QUICK_TUNE 單一程序即可完成任務建立、負載收集、分析與建議生成,大幅降低使用門檻。
-- 1. 授予權限
GRANT ADVISOR TO scott;
-- 2. 執行單條 SQL 調優
VARIABLE task_name VARCHAR2(30);
EXEC :task_name := 'MY_QUICK_TUNE_TASK';
BEGIN
DBMS_ADVISOR.QUICK_TUNE(
advisor_name => DBMS_ADVISOR.SQLACCESS_ADVISOR,
task_name => :task_name,
attr1 => 'SELECT * FROM orders WHERE customer_id = :b1 AND order_date > SYSDATE-30',
attr2 => 'SCOTT', -- 執行用戶
attr3 => 'TASK' -- 模板
);
END;
/
-- 任務日誌
SELECT task_name, status, recommendation_count
FROM dba_advisor_log
WHERE task_name = 'MY_QUICK_TUNE_TASK';
-- 具體建議
SELECT rec_id, rank, benefit, type, attr1 AS action
FROM dba_advisor_recommendations
WHERE task_name = 'MY_QUICK_TUNE_TASK'
ORDER BY rank;
-- 建議執行腳本
SELECT DBMS_ADVISOR.GET_TASK_SCRIPT('MY_QUICK_TUNE_TASK') FROM dual;
DBMS_ADVISOR.CREATE_TASK('SQLACCESS_ADVISOR', 'MY_FULL_TASK')DBMS_ADVISOR.SET_TASK_PARAMETER('MY_FULL_TASK', 'ANALYSIS_SCOPE', 'INDEX')、STORAGE_CHANGE、WORKLOAD_SCOPEDBMS_ADVISOR.CREATE_SQLWKLD('MY_WKLD'),或從 AWR/_cursor_cache/用戶表匯入DBMS_ADVISOR.ADD_SQLWKLD_REF('MY_FULL_TASK', 'MY_WKLD')DBMS_ADVISOR.EXECUTE_TASK('MY_FULL_TASK')DBA_ADVISOR_RECOMMENDATIONS、GET_TASK_SCRIPT針對查詢:
SELECT * FROM sales WHERE amount_sold > 10000;
Advisor 輸出建議:
CREATE BITMAP INDEX sales_amt_bmx ON sales(amount_sold)amount_sold 重複值多、選擇度低、適合 Bitmap Index,避免 Full Table Scan。BENEFIT 欄位量化 IO 減少量。| Advisor | 功能 | 核心 Package |
|---|---|---|
| SQL Access Advisor | 索引/物化視圖/分區建議 | DBMS_ADVISOR (SQLACCESS_ADVISOR) |
| SQL Tuning Advisor | 單條 SQL 執行計畫優化、Profile 建立 | DBMS_SQLTUNE |
| Memory Advisor | SGA/PGA 目標值建議 | DBMS_ADVISOR (MEMORY_ADVISOR) |
| Segment Advisor | 段空間碎片/壓縮建議 | DBMS_ADVISOR (SEGMENT_ADVISOR) |
| Undo Advisor | Undo 保留時間/表空間大小建議 | DBMS_ADVISOR (UNDO_ADVISOR) |
SELECT 權限,否則建議不準。DBMS_STATS.GATHER_TABLE_STATS),Advisor 依賴統計資訊估算成本。QUICK_TUNE;全系統優化必須收集完整業務高峰期工作負載(AWR Snapshot 範圍)。SQL Access Advisor 是「顧問」,不是「執行者」。DBA 的價值在於結合業務語境、寫入模式、維護窗口,判斷哪些建議值得採納、哪些需修改參數、哪些應拒絕。