Oracle 执行计划的获取

Oracle 执行计划的获取

无论是 DBA 还是开发者,我们都需要掌握一些调优手段来帮助快速解决 SQL 性能问题,

执行计划是 SQL 调优的重要手段,

获取执行计划有多种方式, 常用的有以下几种:

1: plsql developer 工具 F5

1: 在 sqldeveloper 中选中 sql 按 F5 即可查看执行计划

2: statistics_level=all

​ 1. 执行语句,设置 statistics_level

 alter session set statistics_level= 'ALL';

​ 2. 运行 sql,查找对应的 SQL_ID

​ 运行 sql 时可以加一些注释,方便查找

select * from v$sqlarea where sql_text like '%umpp0521%' ;

​ 3. 执行以下 SQL 获取执行计划

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

关键字解读:

​ Starts:该 sql 执行的次数。

​ E-Rows:执行计划预估的行数。

​ A-Rows:实际返回的行数。A-Rows 跟 E-Rows 做比较,可以确定哪一步执行计划出问题。

​ A-Time:每一步实际执行的时间(HH:MM:SS.FF),根据这一行可以知道该 sql 耗时在了哪个地方。

​ Buffers:每一步实际执行的逻辑读或一致性读。

​ Reads:物理读。

优点:可以清晰看出来表被访问多少次;有详细的 E-Rows 和 A-Rows 中得到预测的行数和真实的行数;从 Buffers 中看真实的逻辑读

3: dbms_xplan.display_cursor(‘&sql_id’)

​ 1. 获取到 sql_id

​ 2. 执行查询 SQL

select * from table (dbms_xplan.display_cursor( '&sqlId' ));

优点:不用执行 SQL,只需要知道 SQL_ID; 真实的执行计划;

缺点:没有相关统计信息;没办法看到表被访问多少次;没办法看到处理多少行

使用建议

1. 如果某 SQL 执行非常长时间才会出结果,甚至慢到返回不了结果,这时候使用 1;

2. 如果想观察到某条 SQL 有多条执行计划的情况,使用 3;

3. 要想确保看到真实的执行计划,使用 2,3

4. 要想获取表被访问的次数,只能使用方法 2;