暂无图片
Oracle中,一条sql有多个执行计划。如何确认我当前执行sql在使用哪个执行计划呢?
我来答
分享
M
moon
2021-08-27
Oracle中,一条sql有多个执行计划。如何确认我当前执行sql在使用哪个执行计划呢?

一条sql有多个执行计划。如何确认我当前执行sql在使用哪个执行计划呢?

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
每日一步

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
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏