Oracle SQL 调优顾问(SQL Tuning Advisor)
Oracle SQL 调优顾问(SQL Tuning Advisor)
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
SQL Tuning Advisor(STA) 自动分析 SQL 并提供优化建议[1]:
功能:
- 统计信息分析
- SQL Profile 生成
- 访问路径分析
- SQL 重构建议
2. 创建调优任务
2.1 从 SQL ID
DECLARE
v_task VARCHAR2(100);
BEGIN
v_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(
sql_id => '&sql_id',
task_name => 'tune_my_sql'
);
END;
/
2.2 从 SQL 文本
DECLARE
v_task VARCHAR2(100);
BEGIN
v_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(
sql_text => 'SELECT * FROM employees WHERE dept_id = 10',
user_name => 'SCOTT',
scope => 'COMPREHENSIVE',
time_limit => 60,
task_name => 'tune_sql_text',
description => 'Tune SELECT'
);
END;
/
2.3 从 AWR
DECLARE
v_task VARCHAR2(100);
BEGIN
v_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(
begin_snap => 100,
end_snap => 110,
task_name => 'tune_awr'
);
END;
/
3. 执行任务
EXEC DBMS_SQLTUNE.EXECUTE_TUNING_TASK('tune_my_sql');
3.1 查看状态
SELECT status FROM user_advisor_tasks WHERE task_name = 'tune_my_sql';
4. 查看报告
SET LONG 100000
SET LONGCHUNKSIZE 100000
SET LINESIZE 200
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('tune_my_sql') FROM dual;
5. 建议类型
5.1 统计信息
Recommendation: 收集表统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT', 'EMPLOYEES');
5.2 SQL Profile
Recommendation: 接受 SQL Profile
EXEC DBMS_SQLTUNE.ACCEPT_SQL_PROFILE(task_name => 'tune_my_sql', name => 'my_profile');
5.3 索引建议
Recommendation: 创建索引
CREATE INDEX idx_emp_dept ON employees(dept_id);
5.4 SQL 重构
Recommendation: 使用绑定变量
原: WHERE id = 100
改: WHERE id = :1
6. 接受 SQL Profile
6.1 接受
EXEC DBMS_SQLTUNE.ACCEPT_SQL_PROFILE(
task_name => 'tune_my_sql',
name => 'my_profile',
force_match => TRUE
);
6.2 force_match
- TRUE:相似 SQL 都适用
- FALSE:仅精确 SQL
6.3 查看
SELECT
name,
sql_text,
status,
force_matching
FROM dba_sql_profiles;
6.4 删除
EXEC DBMS_SQLTUNE.DROP_SQL_PROFILE('my_profile');
7. 管理 Profile
7.1 修改属性
EXEC DBMS_SQLTUNE.ALTER_SQL_PROFILE(
name => 'my_profile',
attribute_name => 'STATUS',
value => 'DISABLED'
);
7.2 查看 Hint
SELECT
name,
type,
sql_text
FROM dba_sql_profiles;
8. Automatic SQL Tuning
8.1 自动任务
-- 启用
EXEC DBMS_AUTO_TASK_ADMIN.ENABLE(
client_name => 'sql tuning advisor',
operation => NULL,
window_name => NULL
);
-- 查看
SELECT * FROM dba_autotask_client WHERE client_name = 'sql tuning advisor';
8.2 配置
EXEC DBMS_SQLTUNE.SET_AUTO_TUNING_TASK_PARAMETER(
parameter => 'ACCEPT_SQL_PROFILES',
value => 'TRUE'
);
8.3 报告
SELECT DBMS_SQLTUNE.REPORT_AUTO_TUNING_TASK FROM dual;
9. SQL Access Advisor
9.1 概述
- 推荐索引/物化视图
- 更全面的访问结构分析
9.2 创建
DECLARE
v_task VARCHAR2(100);
BEGIN
v_task := DBMS_ADVISOR.CREATE_TASK('SQL Access Advisor', v_task);
DBMS_ADVISOR.SET_TASK_PARAMETER(v_task, 'EXECUTION_TYPE', 'INDEX ONLY');
DBMS_ADVISOR.EXECUTE_TASK(v_task);
END;
/
10. 应用场景
10.1 调优慢 SQL
-- 1. 找到 SQL ID
SELECT sql_id, elapsed_time FROM v$sql ORDER BY elapsed_time DESC FETCH FIRST 5 ROWS ONLY;
-- 2. 调优
DECLARE
v_task VARCHAR2(100);
BEGIN
v_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_id => '&sql_id', task_name => 'tune');
DBMS_SQLTUNE.EXECUTE_TUNING_TASK('tune');
END;
/
-- 3. 查看报告
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('tune') FROM dual;
-- 4. 应用建议
10.2 AWR 中 Top SQL
-- 找慢 SQL
SELECT
sql_id,
elapsed_time_total
FROM dba_hist_sqlstat
WHERE snap_id BETWEEN 100 AND 110
ORDER BY elapsed_time_total DESC
FETCH FIRST 10 ROWS ONLY;
-- 调优
11. 常见坑与排错
11.1 任务失败
-- 查看错误
SELECT status, error_message
FROM user_advisor_tasks
WHERE task_name = 'tune';
-- 重试
EXEC DBMS_SQLTUNE.EXECUTE_TUNING_TASK('tune');
11.2 建议无效
-- 1. 检查统计信息
-- 2. 手动测试
-- 3. SQL Plan Baseline 替代
11.3 Profile 不生效
-- 检查 status
SELECT name, status FROM dba_sql_profiles;
-- 启用
EXEC DBMS_SQLTUNE.ALTER_SQL_PROFILE('name', 'STATUS', 'ENABLED');
12. 最佳实践
- 定期调优 Top SQL:性能
- 接受 Profile:自动优化
- force_match:相似 SQL
- 结合 SQL Access Advisor:索引建议
- 自动任务:无需干预
- 测试建议:验证
- 监控 Profile:效果
- 结合 AWR:分析
- 结合 HINT:精准
- 文档化:可重复
13. 参考资料
[1] Oracle Database Performance Tuning Guide 19c, “SQL Tuning Advisor” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/sql-tuning-advisor.html