暂无图片
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
打赏 0
Lucifer三思而后行
暂无图片

最简单的方式是,通过 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
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
静默安装oracle19c RAC,dbca建库报错ora-00443等错误
回答 4
这个问题解决了吗
安装oracle dg,是不是可以在11g的基础上进行配置主从?
回答 1
已采纳
11g可以搭建DG的呀,这个没问题。
Oracle 表做了delete,但是空间好像没有释放,这个要怎么处理?
回答 5
这个本来就不释放,数据插入到临时表。删除原表。修改临时表。或者move一下表
请教下两条 SQL语句分别在 Mysql(MyIsam , InnoDB) ,Sql Server , Oracle , PGsql 中的效率对比 ?
回答 1
oracle一般会自动选择方案二
Windows2008R2操作系统使用PL/SQL Dev11和instantclient_12_2连接AL32UTF8编码11.2.0.4数据库,where条件使用中文进行过滤,没有结果返回
回答 1
1、把sql拷贝到服务器上sqlplus执行,如果也有问题,那就是sql中的字符非UTF82、检查数据库字符集,确保数据库字符集和查询sql的编码一致。3、更换其它工具测试,排除PL/SQL软件的问题
oracle版本升级方案
回答 2
当然是DG方式,停机时间最短也最靠谱。另外可以不切换,直接激活备库做升级测试。
Windows下Oracle归档的问题
回答 2
楼上正解,建议RMAN,catalog重新注册进来,使用rman删除这部分归档,防止误操作。
Oracle数据库的监控有什么软件推荐吗?
回答 3
已采纳
官方的EM13CC,网上资料也比较多。zabbix也还可以。
Oracle数据库中如果两表是等值连接,为什么不建议走排序合并连接?
回答 1
已采纳
因为排序合并连接需要将两个表放入PGA中,而HASH连接只需要将驱动表放入PGA中,排序合并连接与HASH连接相比,需要耗费更多的PGA。即使排序合并连接中有一个表走的是INDEXFULLSCAN,另
adg的从库 可以看执行计划吗?
回答 2
可以参考一下dbmsxplan.displayawr,可以在备库使用,查看被awr捕获的sql的执行计划,由于awr采样有限,所以不一定能查到所有sql的执行计划。
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~