当前位置: 代码网 > it编程>数据库>Oracle > Oracle执行计划查看方法汇总及优劣对比详解

Oracle执行计划查看方法汇总及优劣对比详解

2024年11月26日 Oracle 我要评论
在oracle 数据库中,查看执行计划是优化 sql 语句性能的重要工具。以下是几种常用的查看执行计划的方法及其优劣比较:1. 使用explain plan for和dbms_xplan.displa

在 oracle 数据库中,查看执行计划是优化 sql 语句性能的重要工具。以下是几种常用的查看执行计划的方法及其优劣比较:

1. 使用 explain plan for 和 dbms_xplan.display

方法

执行 explain plan for 语句

explain plan for
select * from your_table where your_column = 'some_value';

查看执行计划

select * from table(dbms_xplan.display);

优点

  • 简单易用:适用于大多数情况,操作简单。
  • 详细信息:可以提供详细的执行计划信息,包括操作类型、成本、行数等。

缺点

  • 不反映实际执行explain plan 只是模拟执行计划,不一定反映实际执行情况。
  • 需要权限:需要 explain plan 权限。

2. 使用 dbms_xplan.display_cursor

方法

执行 sql 语句

select * from your_table where your_column = 'some_value';

查看执行计划

select * from table(dbms_xplan.display_cursor(null, null, 'allstats last'));

优点

  • 反映实际执行:查看的是实际执行的计划,更能反映真实的性能情况。
  • 详细统计信息:可以提供实际的执行统计信息,如 i/o 次数、cpu 时间等。

缺点

  • 需要执行 sql:必须先执行 sql 语句,才能查看执行计划。
  • 依赖共享池:只能查看在共享池中的 sql 语句的执行计划。

3. 使用 autotrace(仅限 sql*plus)

方法

启用 autotrace

set autotrace on explain;

执行 sql 语句

select * from your_table where your_column = 'some_value';

禁用 autotrace

set autotrace off;

优点

  • 集成在 sql*plus:适用于 sql*plus 用户,操作简便。
  • 即时反馈:执行 sql 语句时立即显示执行计划。

缺点

  • 仅限 sql*plus:只能在 sql*plus 中使用。
  • 功能有限:不如 dbms_xplan.display 提供的信息详细。

4. 使用 v$sql_plan 视图

方法

找到 sql 语句的 sql_id

select sql_id, sql_text from v$sql where sql_text like '%your_sql_statement%';

查询执行计划

select * from v$sql_plan where sql_id = 'your_sql_id';

优点

  • 灵活性高:可以直接查询视图,灵活度高。
  • 实时信息:可以查看当前正在执行的 sql 语句的执行计划。

缺点

  • 复杂性:需要手动查询视图,操作相对复杂。
  • 信息冗余:返回的信息较多,需要筛选有用的部分。

5. 使用 oracle enterprise manager (oem)

方法

  • 登录 oem
  • 导航到 sql 性能页面
  • 输入 sql 语句并查看执行计划

优点

  • 图形界面:提供图形化的用户界面,易于理解和操作。
  • 综合信息:可以查看多种性能指标,不仅仅是执行计划。

缺点

  • 需要 oem:需要安装和配置 oracle enterprise manager。
  • 资源消耗:图形界面可能消耗更多系统资源。

6. 使用 dbms_xplan.display_awr

方法

找到 sql 语句的 sql_id 和 plan_hash_value

select sql_id, plan_hash_value from dba_hist_sqlstat where sql_text like '%your_sql_statement%';

查询执行计划

select * from table(dbms_xplan.display_awr('your_sql_id', 'your_plan_hash_value'));

优点

  • 历史信息:可以查看 awr 中的历史执行计划,有助于长期性能分析。
  • 详细统计:提供详细的执行统计信息。

缺点

  • 需要 awr:需要 awr 功能开启,且需要相应的权限。
  • 复杂性:操作相对复杂,需要查找 sql_id 和 plan_hash_value。

7. 使用事件 10046 跟踪

方法

启用事件 10046 跟踪

对于当前会话:

alter session set events '10046 trace name context forever, level 12';

对于特定的会话(假设 sid 为 123,serial# 为 456):

exec dbms_system.set_sql_trace_in_session(123, 456, true);

执行 sql 语句

select * from your_table where your_column = 'some_value';

禁用事件 10046 跟踪

对于当前会话:

alter session set events '10046 trace name context off';

对于特定的会话(假设 sid 为 123,serial# 为 456):

exec dbms_system.set_sql_trace_in_session(123, 456, false);

查看跟踪文件

查找跟踪文件的位置,通常在

user_dump_dest

参数指定的目录下。

使用

tkprof

工具格式化跟踪文件:

tkprof trace_file.trc output_file.txt explain=your_username/your_password

查看生成的 output_file.txt 文件,其中包含详细的执行计划和性能信息。

优点

  • 详细信息:提供详细的执行计划、执行时间和等待事件等信息,有助于深入分析性能问题。
  • 灵活性:可以针对特定的会话或当前会话启用跟踪。
  • 历史信息:可以保留长时间的跟踪信息,便于后续分析。

缺点

  • 性能开销:启用跟踪会增加系统开销,特别是在高负载情况下。
  • 复杂性:操作相对复杂,需要手动启用和禁用跟踪,以及使用 tkprof 格式化跟踪文件。
  • 文件管理:需要管理和清理生成的跟踪文件,以免占用过多磁盘空间。

8. 使用 statistics_level=all

方法

设置统计级别为 all

alter session set statistics_level=all;

执行 sql 语句

select * from your_table where your_column = 'some_value';

查看执行计划和统计信息

select * from table(dbms_xplan.display_cursor(null, null, 'allstats last'));

优点

  • 详细统计信息:可以提供详细的执行计划和统计信息,包括 i/o 次数、cpu 时间等。
  • 反映实际执行:查看的是实际执行的计划,更能反映真实的性能情况。
  • 操作简单:只需设置统计级别并执行 sql 语句即可。

缺点

  • 性能开销:设置 statistics_level 为 all 会增加执行 sql 语句的性能开销。
  • 临时设置:仅对当前会话有效,需要在每个会话中手动设置。

总结

方法优点缺点
explain plan for + dbms_xplan.display简单易用,详细信息不反映实际执行,需要权限
dbms_xplan.display_cursor反映实际执行,详细统计信息需要执行 sql,依赖共享池
autotrace集成在 sql*plus,即时反馈仅限 sql*plus,功能有限
v$sql_plan灵活性高,实时信息复杂性高,信息冗余
oracle enterprise manager (oem)图形界面,综合信息需要 oem,资源消耗
dbms_xplan.display_awr历史信息,详细统计需要 awr,复杂性
事件 10046 跟踪详细信息,灵活性高,历史信息性能开销,复杂性,文件管理
alter session set statistics_level=all详细统计信息,反映实际执行,操作简单性能开销,临时设置

适用场景

  • explain plan for + dbms_xplan.display:适用于简单的查询优化,快速查看执行计划。
  • dbms_xplan.display_cursor:适用于已经执行的 sql 语句,需要查看实际执行情况。
  • autotrace:适用于 sql*plus 用户,需要快速反馈。
  • v$sql_plan:适用于需要灵活查询执行计划的场景。
  • oracle enterprise manager (oem):适用于需要图形化界面和综合性能信息的场景。
  • dbms_xplan.display_awr:适用于需要查看历史执行计划的场景。
  • 事件 10046 跟踪:适用于需要深入分析性能问题,特别是涉及执行时间和等待事件的场景。
  • statistics_level=all:适用于需要详细统计信息和反映实际执行情况的场景,操作简单但有性能开销。

以上就是oracle执行计划查看方法汇总及优劣对比的详细内容,更多关于oracle执行计划查看方法的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com