一, 执行计划是什么?

  一条查询语句在ORACLE中的执行过程或访问路径的描述。即就是对一个查询任务,做出一份怎样去完成任务的详细方案。

二,执行计划的查看

  设置autotrace

序号

命令

解释

1

SET AUTOTRACE OFF

此为默认值,即关闭Autotrace

2

SET AUTOTRACE ON EXPLAIN

只显示执行计划

3

SET AUTOTRACE ON STATISTICS

只显示执行的统计信息

4

SET AUTOTRACE ON

包含2,3两项内容

5

SET AUTOTRACE TRACEONLY

与ON相似,但不显示语句的执行结果

SQL> set autotrace on;
SQL> select table_name from user_tables;
....特别多...
在最下面
1003 rows selected. Execution Plan ------------这就是执行计划
----------------------------------------------------------
Plan hash value: 3799402342 --------------------------------------------------------------------------------
------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Tim
e | --------------------------------------------------------------------------------
------- | 0 | SELECT STATEMENT | | 5893 | 949K| 605 (1)| 00:
00:08 | |* 1 | HASH JOIN RIGHT OUTER | | 5893 | 949K| 605 (1)| 00:
00:08 | | 2 | TABLE ACCESS FULL | SEG$ | 5734 | 63074 | 47 (0)| 00:
00:01 | |* 3 | HASH JOIN RIGHT OUTER | | 2798 | 420K| 558 (1)| 00:
00:07 | | 4 | INDEX FULL SCAN | I_USER2 | 86 | 344 | 1 (0)| 00:
00:01 | |* 5 | HASH JOIN | | 2798 | 409K| 557 (1)| 00:
00:07 | | 6 | TABLE ACCESS FULL | TS$ | 5 | 15 | 3 (0)| 00:
00:01 | |* 7 | HASH JOIN OUTER | | 2798 | 401K| 554 (1)| 00:
00:07 | |* 8 | HASH JOIN OUTER | | 2798 | 379K| 486 (1)| 00:
00:06 | | 9 | NESTED LOOPS | | 2798 | 366K| 418 (1)| 00:
00:06 | | 10 | MERGE JOIN CARTESIAN| | 3751 | 380K| 292 (1)| 00:
00:04 | |* 11 | HASH JOIN | | 1 | 68 | 0 (0)| 00:
00:01 | |* 12 | FIXED TABLE FULL | X$KSPPI | 1 | 55 | 0 (0)| 00:
00:01 | | 13 | FIXED TABLE FULL | X$KSPPCV | 100 | 1300 | 0 (0)| 00:
00:01 | | 14 | BUFFER SORT | | 3751 | 131K| 292 (1)| 00:
00:04 | |* 15 | TABLE ACCESS FULL | OBJ$ | 3751 | 131K| 292 (1)| 00:
00:04 | |* 16 | TABLE ACCESS CLUSTER| TAB$ | 1 | 30 | 1 (0)| 00:
00:01 | |* 17 | INDEX UNIQUE SCAN | I_OBJ# | 1 | | 0 (0)| 00:
00:01 | | 18 | INDEX FAST FULL SCAN | I_OBJ1 | 86281 | 421K| 68 (0)| 00:
00:01 | | 19 | INDEX FAST FULL SCAN | I_OBJ1 | 86281 | 674K| 68 (0)| 00:
00:01 | --------------------------------------------------------------------------------
------- Predicate Information (identified by operation id):
--------------------------------------------------- 1 - access("T"."FILE#"="S"."FILE#"(+) AND "T"."BLOCK#"="S"."BLOCK#"(+) AND
"T"."TS#"="S"."TS#"(+))
3 - access("CX"."OWNER#"="CU"."USER#"(+))
5 - access("T"."TS#"="TS"."TS#")
7 - access("T"."DATAOBJ#"="CX"."OBJ#"(+))
8 - access("T"."BOBJ#"="CO"."OBJ#"(+))
11 - access("KSPPI"."INDX"="KSPPCV"."INDX")
12 - filter("KSPPI"."KSPPINM"='_dml_monitoring_enabled')
15 - filter("O"."OWNER#"=USERENV('SCHEMAID') AND BITAND("O"."FLAGS",128)=0)
16 - filter(BITAND("T"."PROPERTY",1)=0)
17 - access("O"."OBJ#"="T"."OBJ#") Statistics -----这里是统计信息
----------------------------------------------------------
8 recursive calls
0 db block gets
8809 consistent gets
0 physical reads
0 redo size
31347 bytes sent via SQL*Net to client
1250 bytes received via SQL*Net from client
68 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1003 rows processed

  使用sql查看

SQL> set autotrace off;
SQL> explain plan for select * from WRI$_DBU_FEATURE_METADATA; Explained. SQL> SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE')); PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 563503327 --------------------------------------------------------------------------------
--------------- | Id | Operation | Name | Rows | Bytes | Cost (%C
PU)| Time | --------------------------------------------------------------------------------
--------------- PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 176 | 91344 | 5
(0)| 00:00:01 | | 1 | TABLE ACCESS FULL| WRI$_DBU_FEATURE_METADATA | 176 | 91344 | 5
(0)| 00:00:01 | --------------------------------------------------------------------------------
--------------- 8 rows selected. SQL> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 563503327 --------------------------------------------------------------------------------
--------------- | Id | Operation | Name | Rows | Bytes | Cost (%C
PU)| Time | --------------------------------------------------------------------------------
--------------- PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 176 | 91344 | 5
(0)| 00:00:01 | | 1 | TABLE ACCESS FULL| WRI$_DBU_FEATURE_METADATA | 176 | 91344 | 5
(0)| 00:00:01 | --------------------------------------------------------------------------------
--------------- 8 rows selected. SQL>

  客户端的话界面有解释选项自己找找

三,执行计划解释

  01.执行顺序的原则

    执行顺序的原则是:由上至下,从右向左
     由上至下:在执行计划中一般含有多个节点,相同级别(或并列)的节点,靠上的优先执行,靠下的后执行

     从右向左:在某个节点下还存在多个子节点,先从最靠右的子节点开始执行。

   02,执行计划

 

  ID: 一个序号,但不是执行的先后顺序。执行的先后根据缩进来判断。

  Operation: 当前操作的内容。

  Rows: 当前操作的Cardinality,Oracle估计当前操作的返回结果集。

  Cost(CPU):Oracle 计算出来的一个数值(代价),用于说明SQL执行的代价。

  Time:Oracle 估计当前操作的时间。

  3,谓词

Access :

  • 通过某种方式定位了需要的数据,然后读取出这些结果集,叫做Access。
  • 表示这个谓词条件的值将会影响数据的访问路劲(表还是索引)。

Filter:

  • 把所有的数据都访问了,然后过滤掉不需要的数据,这种方式叫做filter 。
  • 表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。

在谓词中主要注意access,要考虑谓词的条件,使用的访问路径是否正确

  4,统计信息

recursive calls

产生的递归sql调用的条数。

当执行一条SQL语句时,产生的对其他SQL语句的调用,这些额外的语句称之为''recursive calls''或''recursive SQL statements''. 我们做一条insert 时,没有足够的空间来保存row记录,Oracle 通过Recursive Call 来动态的分配空间。

Db block gets:

从buffer cache中读取的block的数量

当前模式块意思就是在操作中正好提取的块数目,而不是在一致性读的情况下而产生的块数。正常的情况下,一个查询提取的块是在查询开始的那个时间点上存在的数据块,当前块是在这个时刻存在的数据块,而不是在这个时间点之前或者之后的数据块数目。

consistent gets

从buffer cache中读取的undo数据的block的数量

在处理你这个操作的时候需要在一致性读状态上处理多少个块,这些块产生的主要原因是因为由于在你查询的过程中,由于其他会话对数据块进行操作,而对所要查询的块有了修改,但是由于我们的查询是在这些修改之前调用的,所以需要对回滚段中的数据块的前映像进行查询,以保证数据的一致性。这样就产 生了一致性读。

physical reads

从磁盘读取的block的数量

从磁盘上读取数据块的数量,其产生的主要原因是:

(1) 在数据库高速缓存中不存在这些块

(2) 全表扫描

(3) 磁盘排序

逻辑读指的是Oracle从内存读到的数据块数量。一般来说是'consistent gets' + 'db block gets'。当在内存中找不到所需的数据块的话就需要从磁盘中获取,于是就产生了'physical reads'。

Physical Reads通常是我们最关心的,如果这个值很高,说明要从磁盘请求大量的数据到Buffer Cache里,通常意味着系统里存在大量全表扫描的SQL语句,这会影响到数据库的性能,因此尽量避免语句做全表扫描,对于全表扫描的SQL语句,建议增 加相关的索引,优化SQL语句来解决。

数据缓冲区的使用命中率=1 - ( physical reads / (db block gets + consistent gets) )。

查看缓存命中率

SELECT name, value FROM v$sysstat WHERE name IN ('db block gets', 'consistent gets','physical reads');

redo size

DML生成的redo的大小

bytes sent via SQL*Net to client

数据库服务器通过SQL*Net向查询客户端发送的查询结果字节数

bytes received via SQL*Net from client

通过SQL*Net接受的来自客户端的数据字节数

SQL*Net roundtrips to/from client

服务器和客户端来回往返通信的Oracle Net messages条数

Oracle Net是把Oracle网络粘合起来的粘合剂。它负责处理客户到服务器和服务器到客户通信,

sorts (memory)

在内存执行的排序量

sorts (disk)

在磁盘上执行的排序量

所有的sort都是优先在memory中做的,当要排序的内容太多,在sort area中放不下的时候,会需要临时表空间,产生sorts(disk)

rows processed

处理的数据的行数

oracle 基础知识(十三)----执行计划的更多相关文章

  1. Oracle基础知识汇总一

    Oracle基础知识 以下内容为本人的学习笔记,如需要转载,请声明原文链接   https://www.cnblogs.com/lyh1024/p/16720759.html oracle工具: SQ ...

  2. 图说Oracle基础知识(一)

    本文主要对Oralce数据库操作的基础知识进行一下梳理,以便进行归纳总结.适用于未使用过Oracle数据库的读者,或需要学习Oracle数据库方面的基础知识.如有不足之处,还请指正. 关于SQL介绍的 ...

  3. 查看Oracle数据库中的执行计划

    1.set autotrace traceonly命令 2.explain plan for命令 1)explain plan for select * from dual; 2)select * f ...

  4. Oracle 基础知识入门

    前记: 近来项目用到Oracle数据库,大学学了点,后面基本忘记得差不多了,虽然基本语法跟sql 差不多,但是oracle知识是非常多的. 这里简单说点基础知识,希望后面补上更多的关于ORacle知识 ...

  5. Oracle(一)执行计划

    目录 一.什么是执行计划 二.如何查看执行计划 三.如何读懂执行计划 1. 执行顺序的原则 2. 执行计划中字段解释 3. 谓词说明 4. JOIN方式 4.1 HASH JOIN(散列连接) 4.2 ...

  6. Oracle性能优化之oracle中常见的执行计划及其简单解释

    一.访问表执行计划 1.table access full:全表扫描.它会访问表中的每一条记录(读取高水位线以内的每一个数据块). 2.table access by user rowid:输入源ro ...

  7. oracle 基础知识(十四)----索引扫描

    (1)索引唯一扫描(index unique scan) 通过唯一索引查找一个数值经常返回单个ROWID.如果该唯一索引有多个列组成(即组合索引),则至少要有组合索引的引导列参与到该查询中,如创建一个 ...

  8. oracle 基础知识(九)----SQL解析

    一,解析过程 二,硬解析,软解析,软软解析 01,硬解析 将SQL语句通过监听器发送到Oracle时, 会触发一个Server process生成,来对该客户进程服务.Server process得到 ...

  9. oracle 基础知识(四) 构成

    一, oracle服务 一个oracle 服务由一个oracle 实例和一个oracle数据库组成. oracle = instance + database 总体概念: 二, oracle 实例 0 ...

随机推荐

  1. Quartus II 14.0正式版 下载链接和破解器

    Windows版本 必装组件: Quartus II http://download.altera.com/akdlm/software/acdsinst/14.0/200/ib_installers ...

  2. Linq学习<三> linq to entity

    之前一直用sql选择出数据放在一个集合中,然后再用Linq或者lambda去操作数据,今天学了Linq to entity 才知道原来linq产生是为了Entity.也就是EDM(实体数据模型) 关于 ...

  3. layer弹出框插件参数及方法介绍

    layerui下载:http://www.layui.com 更多参数请阅读开发文档:http://www.layui.com/doc/modules/layer.html Layui 是一款采用自身 ...

  4. py_initialize:C调Python出错 是初始化错误?

    还是pythonpath和pythonname变量没有配置正确? py_initialize()方法是什么? In an application embedding Python, this shou ...

  5. 编写高质量代码改善C#程序的157个建议——建议21:选择正确的集合

    建议21:选择正确的集合 要选择正确的集合,首先要了解一些数据结构的知识.所谓数据结构,就是相互之间存在一种或多种特定关系的数据元素的集合. 集合的分类参考下图: 由于非泛型集合存在效率低及非类型安全 ...

  6. 301 MovedPermanently 重定向

    页面永久性移走(301重定向)是一种非常重要的“自动转向”技术. 301重定向可促进搜索引擎优化效果 从搜索引擎优化角度出发,301重定向是网址重定向最为可行的一种办法.当网站的域名发生变更后,搜索引 ...

  7. wp面试题

    初级工程师 解释什么是依赖属性,它和以前的属性有什么不同?为什么在WPF会使用它? 什么是样式什么是模板 绑定(Binding )的基础用法 解释这几个类的作用及关系: Visual, UIEleme ...

  8. windows下vscode 搭建python开发环境

    1.vscode https://code.visualstudio.com/ 下载 2.python下载 https://www.python.org/downloads/windows/  exe ...

  9. angular启动过程

    第一步: .angular-cli.json 第二步: 第三步: 第四步: 第五步:

  10. 复制构造函数被调用的三种情况------新标准c++程序设计

    1.当用一个对象去初始化同类的另一个对象时,会引发复制构造函数被调用.例如,下面的两条语句都会引发复制构造函数的调用,用以初始化c2. C c2 (c1); C c2=c1; 这两条语句是等价的.注意 ...