Oracle 执行计划详解

发布时间:2022-06-27 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Oracle 执行计划详解脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

CSDN:

https://blog.csdn.net/qq_34745941/article/details/106068346

 

文章目录1 概述1.1 思维导图1.2 概念2 执行计划2.1 预估的2.2 真实的3 示例4 备选命令1 概述什么是 Oracle 的执行计划?

执行计划是一条查询语句在 Oracle 中的执行过程或访问路径的描述简单一点说,就是: Oracle 是如何执行 sql 语句的。

比如说,就像咱去一个地方,事先会计划好怎么坐车一样。先坐公交车到哪儿再坐地铁,oracle 的执行计划也是如此,就是一步一步地执行 sql。oracle 的执行计划是很复杂的,一般我们看到的执行计划都是 oracle 通过内部算法计算以后选择的一个消耗比较少的执行路径,就像我们去哪里也要选择一条捷径一样的道理。1.1 思维导图

1.2 概念表访问方式 - (全表扫描、通过 rowid 扫描、通过索引扫描)

表连接方式详解 - (nested loops、hash join、sort merge join)

2 执行计划2.1 预估的最简单的方式:通过 pl/sql developer 的 F5 进行查看:

2.2 真实的前提说明:

(1) 该用户(如:scott)要有访问动态视图的权限(最常用的用户:system)    grant select any dictionary to scott;

(2) sql 已执行完成1234具体步骤:

1. 获取执行计划的统计信息(两种方式) '下列两条命令必须在同一个窗口执行哦'alter session set statistics_level = all; -- 推荐select * from dual;-- 设置前,可以用下列两种方式查询当前的 参数信息-- select * from v$parameter t where t.name = 'statistics_level';-- show parameter statistics_level或(每次查询时,每个 sql 语句都加上下列 hint):select /*+ gather_plan_statistics */ * from dual;

2. 找出执行语句的 'sql_id'select t.*  from v$sql t where t.sql_text like '%select * from%' order by t.last_active_time desc;

3. 根据 'sql_id' 查出 '真实执行计划(最近一条)'select * from table(dbms_xplan.display_cursor('cyfzxc61h3g3r',null,'allstats last')); 12345678910111213141516173 示例获取 真实的执行计划

1. 执行的 sql 语句:

select /*+ gather_plan_statistics*/ t.*  from scott.emp t where t.empno >= 7782;12342. 找出执行语句的 ‘sql_id’:

select t.*  from v$sql t where t.sql_text like '%where t.empno >= 7782%' order by t.last_active_time desc;12343. 根据 ‘sql_id’ 查出 ‘真实执行计划(最近一条)’:

select * from table(dbms_xplan.display_cursor('92dkjj0sw6wjr',null,'allstats last'));1最终结果:

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 Connected as system@orcl

SQL> select * from table(dbms_xplan.display_cursor('92dkjj0sw6wjr',null,'allstats last'));PLAN_TABLE_OUTPUT----------------------------------------------------------------------------------------------------SQL_ID  92dkjj0sw6wjr, child number 0-------------------------------------select /*+ gather_plan_statistics*/  t.*   from scott.emp t  wheret.empno >= 7782Plan hash value: 169057108------------------------------------------------------------------------------------------------| Id  | Operation                   | Name   | Starts | E-Rows | A-Rows |   A-Time   | Buffers |------------------------------------------------------------------------------------------------|   0 | SELECT STATEMENT            |        |      1 |        |      8 |00:00:00.01 |       2 ||   1 |  TABLE ACCESS BY INDEX ROWID| EMP    |      1 |      5 |      8 |00:00:00.01 |       2 ||*  2 |   INDEX RANGE SCAN          | PK_EMP |      1 |      5 |      8 |00:00:00.01 |       1 |------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   2 - access("T"."EMPNO">=7782)20 rows selected

SQL> 123456789101112131415161718192021222324参数说明:

Starts      该 sql 执行的次数E-Rows      预计返回的行数A-Rows      实际返回的行数。可以和 E-Rows 比对,确定哪一步出现了问题A-Time          每一步实际执行的时间Buffers     每一步实际执行的逻辑读或一致性读Reads        每一步实际执行的物理读Writes      每一步实际执行的物理写OMem        最优执行模式所需的内存评估值1Mem        one-pass模式所需的内存评估值Used_Mem    则为当前操作实际执行时消耗的内存            括号里面为(发生磁盘交换的次数,1次即为One-Pass,大于1次则为Multi_Pass,如果没有使用磁盘,则显示0)123456

文章目录1 概述1.1 思维导图1.2 概念2 执行计划2.1 预估的2.2 真实的3 示例4 备选命令1 概述什么是 Oracle 的执行计划?

执行计划是一条查询语句在 Oracle 中的执行过程或访问路径的描述简单一点说,就是: Oracle 是如何执行 sql 语句的。

比如说,就像咱去一个地方,事先会计划好怎么坐车一样。先坐公交车到哪儿再坐地铁,oracle 的执行计划也是如此,就是一步一步地执行 sql。oracle 的执行计划是很复杂的,一般我们看到的执行计划都是 oracle 通过内部算法计算以后选择的一个消耗比较少的执行路径,就像我们去哪里也要选择一条捷径一样的道理。1.1 思维导图

1.2 概念表访问方式 - (全表扫描、通过 rowid 扫描、通过索引扫描)

表连接方式详解 - (nested loops、hash join、sort merge join)

2 执行计划2.1 预估的最简单的方式:通过 pl/sql developer 的 F5 进行查看:

2.2 真实的前提说明:

(1) 该用户(如:scott)要有访问动态视图的权限(最常用的用户:system) grant select any dictionary to scott;

(2) sql 已执行完成1234具体步骤:

1. 获取执行计划的统计信息(两种方式) '下列两条命令必须在同一个窗口执行哦'alter session set statistics_level = all; -- 推荐select * from dual;-- 设置前,可以用下列两种方式查询当前的 参数信息-- select * from v$parameter t where t.name = 'statistics_level';-- show parameter statistics_level或(每次查询时,每个 sql 语句都加上下列 hint):select /*+ gather_plan_statistics */ * from dual;

2. 找出执行语句的 'sql_id'select t.* from v$sql t where t.sql_text like '%select * from%' order by t.last_active_time desc;

3. 根据 'sql_id' 查出 '真实执行计划(最近一条)'select * from table(dbms_xplan.display_cursor('cyfzxc61h3g3r',null,'allstats last')); 12345678910111213141516173 示例获取 真实的执行计划

1. 执行的 sql 语句:

select /*+ gather_plan_statistics*/ t.* from scott.emp t where t.empno >= 7782;12342. 找出执行语句的 ‘sql_id’:

select t.* from v$sql t where t.sql_text like '%where t.empno >= 7782%' order by t.last_active_time desc;12343. 根据 ‘sql_id’ 查出 ‘真实执行计划(最近一条)’:

select * from table(dbms_xplan.display_cursor('92dkjj0sw6wjr',null,'allstats last'));1最终结果:

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 Connected as system@orcl

SQL> select * from table(dbms_xplan.display_cursor('92dkjj0sw6wjr',null,'allstats last'));PLAN_TABLE_OUTPUT----------------------------------------------------------------------------------------------------SQL_ID 92dkjj0sw6wjr, child number 0-------------------------------------select /*+ gather_plan_statistics*/ t.* from scott.emp t wheret.empno >= 7782Plan hash value: 169057108------------------------------------------------------------------------------------------------| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |------------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | | 8 |00:00:00.01 | 2 || 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 5 | 8 |00:00:00.01 | 2 ||* 2 | INDEX RANGE SCAN | PK_EMP | 1 | 5 | 8 |00:00:00.01 | 1 |------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 2 - access("T"."EMPNO">=7782)20 rows selected

SQL> 123456789101112131415161718192021222324参数说明:

Starts 该 sql 执行的次数E-Rows 预计返回的行数A-Rows 实际返回的行数。可以和 E-Rows 比对,确定哪一步出现了问题A-Time 每一步实际执行的时间Buffers 每一步实际执行的逻辑读或一致性读Reads 每一步实际执行的物理读Writes 每一步实际执行的物理写OMem 最优执行模式所需的内存评估值1Mem one-pass模式所需的内存评估值Used_Mem 则为当前操作实际执行时消耗的内存 括号里面为(发生磁盘交换的次数,1次即为One-Pass,大于1次则为Multi_Pass,如果没有使用磁盘,则显示0)12345678910114 备选命令SQL> set col 100 -- 设置显示 100 列(若命令窗口显示不全时使用)SQL>SQL> clear -- 清屏123

————————————————版权声明:本文为CSDN博主「鱼丸丶粗面」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qq_34745941/article/details/106068346

78910114 备选命令SQL> set col 100  -- 设置显示 100 列(若命令窗口显示不全时使用)SQL>SQL> clear -- 清屏123

————————————————版权声明:本文为CSDN博主「鱼丸丶粗面」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qq_34745941/article/details/106068346

脚本宝典总结

以上是脚本宝典为你收集整理的Oracle 执行计划详解全部内容,希望文章能够帮你解决Oracle 执行计划详解所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: