Oracle 执行计划调整与固定(Automatic-SQL Profile)

本文介绍了一种通过创建SQLProfile来自动调整SQL执行计划的方法,不仅能够提升SQL执行效率,还能固定执行计划,避免因数据变化导致的性能下降。通过具体步骤演示了如何创建、执行优化任务,查看及应用优化报告,以及如何管理和删除优化任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         众所周知,SQL的查询快慢直接影响用户的使用体验,而一个SQL的执行速度主要取决于它采用何种执行计划,在常年累月的系统使用中,数据的不断积累,很可能曾经飞快的SQL变得颤颤巍巍,一秒十卡。其幕后元凶就是表数据的增加造成了优化器对当前执行计划的篡改。

         本章介绍一项有效固定执行计划的方式,大家通过该方式不仅可以固定执行计划,还可以进行SQL调优等操作。

一、创建SQL Profile自动调整任务

Declare
    mTaskName  Varchar2(30);
    mSqlText  Clob;
Begin
    mSqlText := 'Select /*+ no_index(sls idx_sls) */ * From sls Where n=''1''';
    mTaskName  := dbms_sqltune.create_tuning_task(
                             sql_text => mSqlText ,
                             user_name => 'AIKES',
                             Scope     => 'COMPREHENSIVE',
                             time_limit => 60,
                             task_name => 'Aikes_tune_task',
                             description => 'Task to tune a query on table sls');
End;

1、mSqlText:待优化的SQL,这里需要注意单引号的转义写法,并且SQL末尾不能有分号

2、user_name:当前数据库登录用户名

3、task_name:当前优化任务的名称

 

二、执行sql调整任务

Begin
    dbms_sqltune.execute_tuning_task(task_name => ' Aikes_tune_task ');
End;

1、task_name:前一步创建好的优化任务名称

 

三、查看SQL优化报告

查询该SQL,打开CLOB内容即为优化报告。

Select dbms_sqltune.report_tuning_task(task_name => ' Aikes_tune_task ') From dual;

1、SQL优化

        优化报告会提示一些基本的优化方式,例如:收集统计信息、创建索引等等。

2、固定执行计划

        若没有可优化的方式,则会提示找到了性能更好的执行计划,大家可以执行推荐的指令进行执行计划固定,之后,该SQL的查询会一直走此执行计划。

注:在执行优化语句后,默认为全SQL匹配优化,例如:条件为n=1,则优化只针对n=1的sql,通过给优化语句增加参数 force_match => True,可以实现同类型语句都达到优化效果(绑定变量生效)。

begin
    dbms_sqltune.accept_sql_profile(task_name => 'Aikes_tune_task',task_owner => 'AIKES', force_match => True ,replace => TRUE);
end;

        本例中,我将待优化的SQL加上了不使用索引的hint,所以此时的查询是全表扫描。若执行了SQL Profile推荐的指令后,它将会采用走索引的执行计划,这样SQL中的hint不再生效,从而实现了不改变SQL文本情况下优化SQL。

 

四、删除优化任务

        通过该SQL可以查看当前有哪些优化任务:

Select * FROM Dba_Tune_Mview Where owner = 'Aikes';

        通过该指令删除优化任务:

Begin
       dbms_sqltune.drop_tuning_task(task_name => ' Aikes_tune_task ');
End;

五、删除固定的执行计划

         通过查看SQL的统计信息,可以在最下方看到该SQL使用了何种SQL Profile

        可以看到,此时执行计划走的是索引,在NOTE栏写着该SQL使用了SQL Profile。

 

        通过该指令删除固定的执行计划:

Begin
  dbms_sqltune.drop_sql_profile(name => ' SYS_SQLPROF_0168372e2f030000 ');
End;

 

        执行完成后再次查看,SQL变成了全表扫描,固定的执行计划也已经被删除。

 

七、总结

         通过SQL Profile 进行固定执行计划,一定程度上可以实现不改变SQL文本而提升SQL执行效率,但是随着时间累积,数据量增加、索引变动等等,都会导致被固定的执行计划效率变低,又需要重新调整执行计划,若当时做优化的开发人员现在已经离职,重新排查必定是个不小的工作量。

         所以,凡事无绝对,把握好调优的天平才能做到真正的得心应手。

Oracle 数据库中,查看和分析 SQL 执行计划是优化查询性能的重要手段之一。通过执行计划可以了解数据库是如何访问数据、使用哪些索引、如何连接表等信息,从而识别潜在的性能瓶颈并进行调优。 ### 查看执行计划的方法 1. **使用 `EXPLAIN PLAN` 命令** `EXPLAIN PLAN` 是一个可以在不实际执行 SQL 的情况下获取执行计划的工具[^4]。使用方法如下: ```sql EXPLAIN PLAN FOR SELECT * FROM employees WHERE department_id = 10; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); ``` 上述语句会将执行计划存储在 `PLAN_TABLE` 中,并通过 `DBMS_XPLAN.DISPLAY` 函数展示结果。该方法适用于静态分析,尤其适合开发阶段或测试环境中使用。 2. **使用 SQL*Plus 的 `AUTOTRACE` 功能** 在 SQL*Plus 环境下,可以通过启用 `AUTOTRACE` 来查看 SQL执行计划和运行时统计信息[^2]。启用方式如下: ```sql SET AUTOTRACE ON EXPLAIN; ``` 此后执行SQL 语句将自动显示其执行计划,但不会显示实际运行时的统计信息。如果需要同时显示执行计划和统计信息,可以使用: ```sql SET AUTOTRACE ON; ``` 3. **使用 AWR 报告查看历史执行计划** 如果希望查看过去一段时间内某个 SQL执行计划变化情况,可以通过 AWR(Automatic Workload Repository)报告来实现[^1]。使用 `DBMS_WORKLOAD_REPOSITORY` 包生成 AWR 报告,或者通过 Enterprise Manager Cloud Control 查看特定 SQL 的多个执行计划,有助于分析执行计划的稳定性性能波动。 4. **使用 `V$SQL_PLAN` 视图** 对于已经在共享池中存在的 SQL 语句,可以直接查询 `V$SQL_PLAN` 视图来获取当前的执行计划。例如: ```sql SELECT * FROM v$sql_plan WHERE sql_id = 'your_sql_id'; ``` 这种方法适用于实时监控正在运行的 SQL 语句的执行路径。 ### 分析执行计划的关键点 - **访问路径(Access Path)**:判断是否使用了正确的索引扫描(如 INDEX RANGE SCAN)或全表扫描(FULL TABLE SCAN),避免不必要的大表扫描。 - **连接顺序(Join Order)**:确保表之间的连接顺序合理,减少中间结果集的大小。 - **连接方法(Join Method)**:常见的有嵌套循环(NESTED LOOPS)、哈希连接(HASH JOIN)和排序合并连接(SORT MERGE JOIN),应根据数据分布选择合适的方式。 - **并行操作(Parallel Execution)**:对于大数据量处理,检查是否启用了并行执行以提升效率。 ### 使用 SQL Profile 固定执行计划 当发现某个 SQL执行计划不稳定或性能不佳时,可以使用 SQL Profile 来绑定执行计划[^1]。通过 `DBMS_SQLTUNE` 包创建 SQL 调优任务,建议执行计划并应用 SQL Profile,从而强制优化器使用指定的执行路径。 ```sql DECLARE l_task_name VARCHAR2(30); BEGIN l_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK( sql_id => 'your_sql_id', scope => DBMS_SQLTUNE.SCOPE_COMPREHENSIVE, time_limit => 60, task_name => 'tune_emp_query', description => 'Tuning task for emp query'); DBMS_SQLTUNE.EXECUTE_TUNING_TASK(task_name => 'tune_emp_query'); END; / SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('tune_emp_query') AS report FROM dual; ``` 执行完成后,可以根据建议创建 SQL Profile固化高效的执行计划。 ### 总结 Oracle 提供了多种途径来查看和分析 SQL执行计划,结合 `EXPLAIN PLAN`、`AUTOTRACE`、`V$SQL_PLAN` 和 AWR 报告等工具,可以全面掌握 SQL执行行为。通过对执行计划的深入分析,识别出低效的操作并加以优化,能够显著提升数据库的整体性能表现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aikes902

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值