一条sql有多个执行计划。如何确认我当前执行sql在使用哪个执行计划呢?
1、通过【dbms_xplan.display_cursor】获取【真实】的执行计划
方法:
1步: alter session set statistics_level=all;
2步: 执行你的SQL语句;
3步: select * from table(dbms_xplan.display_cursor(null,null,‘allstats last’));
–通过以上步骤,就是获取当前执行SQL语句的真实执行计划。
2、测试
以下演示同一个表名对应不同的用户(表结构不同),就会产生一条SQL产生多个执行计划。即【SQL_ID相同,PLAN不同】;
1步: 用户1
SQL> show user;
USER is “LQY”
SQL>
SQL> alter session set statistics_level=all;
Session altered.
SQL> select count(*) from emp;
COUNT(*)
14
SQL> select * from table(dbms_xplan.display_cursor(null,null,‘allstats last’));
PLAN_TABLE_OUTPUT
SQL_ID g59vz2u4cu404, child number 1
select count(*) from emp
Plan hash value: 2083865914
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 3 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 3 |
| 2 | TABLE ACCESS FULL| EMP | 1 | 14 | 14 |00:00:00.01 | 3 |
Note
- dynamic sampling used for this statement (level=2)
18 rows selected.
SQL>
【小结】
SQL_ID g59vz2u4cu404, child number 1
2步: 用户2
SQL> show user;
USER is “SCOTT”
SQL> alter session set statistics_level=all;
Session altered.
SQL> select count(*) from emp;
COUNT(*)
14
SQL> select * from table(dbms_xplan.display_cursor(null,null,‘allstats last’));
PLAN_TABLE_OUTPUT
SQL_ID g59vz2u4cu404, child number 2
select count(*) from emp
Plan hash value: 2937609675
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buff
ers |
PLAN_TABLE_OUTPUT
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 |
1 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 |
1 |
| 2 | INDEX FULL SCAN| PK_EMP | 1 | 14 | 14 |00:00:00.01 |
PLAN_TABLE_OUTPUT
1 |
14 rows selected.
【小结】
SQL_ID g59vz2u4cu404, child number 2
3、【扩展】
3.1、查询SQL所有执行计划
SELECT * FROM TABLE(SYS.DBMS_XPLAN.DISPLAY_CURSOR(‘g59vz2u4cu404’,null))
3.2、查询SQL的CHILD NUMBER为1的执行计划,即用户LQY
SELECT * FROM TABLE(SYS.DBMS_XPLAN.DISPLAY_CURSOR(‘g59vz2u4cu404’,1))
3.2、查询SQL的CHILD NUMBER为2的执行计划,即用户SCOTT
SELECT * FROM TABLE(SYS.DBMS_XPLAN.DISPLAY_CURSOR(‘g59vz2u4cu404’,2)
评论
有用 0最简单的方式是,通过 v$sql 查到当前sql的sql_id。
获取sql执行计划:
然后执行
sqlplus / as sysdba @?/rdbms/admin/awrsqrpt.sql
获取该sql_id的报告,查看有几个执行计划以及当前使用的执行计划。
优化方式:
可以通过 sqltrpt 报告获取 oracle 推荐的执行计划:
sqlplus / as sysdba @?/rdbms/admin/sqltrpt.sql
输入 sql_id,获取系统推荐优化建议,绑定最优执行计划。
希望能帮助到你!
评论
有用 0
墨值悬赏


