码迷,mamicode.com
首页 > 其他好文 > 详细

Oracale执行计划学习

时间:2021-01-18 11:35:03      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:索引范围扫描   导致   dex   gets   统计信息   height   reads   硬盘   信息   

◆以下来自:Oracle 执行计划(Explain Plan):https://www.cnblogs.com/xqzt/p/4467867.html    ※ 很强

1,取得执行计划(autotrace)

    1.1 设置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相似,但不显示语句的执行结果

    1.2 使用SQL取得执行计划
      在执行的sql前面加上EXPLAIN PLAN FOR

SQL> EXPLAIN PLAN FOR SELECT * FROM EMP;

已解释。

SQL> SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY(‘PLAN_TABLE‘));
或者:
SQL> select * from table(dbms_xplan.display);

    1.3 用工具取得执行计划

如,PL/SQL Developer,Navicat, Toad等。

二、如何读懂执行计划

     2.1执行顺序的原则

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

一般按缩进长度来判断,缩进最大的最先执行,如果有2行缩进一样,那么就先执行上面的。

    2.2 执行计划中字段解释

技术图片

ID: 一个序号,但不是执行的先后顺序。执行的先后根据缩进来判断。
Operation: 当前操作的内容。
Rows: 当前操作的Cardinality,Oracle估计当前操作的返回结果集。
Cost(CPU):Oracle 计算出来的一个数值(代价),用于说明SQL执行的代价。
Time:Oracle 估计当前操作的时间。

    2.3 谓词说明

技术图片

 Access :

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

Filter:
    把所有的数据都访问了,然后过滤掉不需要的数据,这种方式叫做filter 。
    表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。
    在谓词中主要注意access,要考虑谓词的条件,使用的访问路径是否正确。

    2.4 Statistics(统计信息)说明

技术图片

 

 统计项目 内容   详细  
recursive calls 产生的递归sql调用的条数。 当执行一条SQL语句时,产生的对其他SQL语句的调用,这些额外的语句称之为‘‘recursive calls‘‘或‘‘recursive SQL statements‘‘. 我们做一条insert 时,没有足够的空间来保存row记录,Oracle 通过Recursive Call 来动态的分配空间。  
Db block gets 从buffer cache中读取的block的数量

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

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

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

 
physical reads 从磁盘读取的block的数量

Physical Reads:实例启动后,从磁盘读到Buffer Cache数据块数量)
就是从磁盘上读取数据块的数量,其产生的主要原因是:
(1) 在数据库高速缓存中不存在这些块
(2) 全表扫描
(3) 磁盘排序

它们三者之间的关系大致可概括为:
逻辑读指的是Oracle从内存读到的数据块数量。一般来说是‘consistent gets‘ + ‘db block gets‘。当在内存中找不到所需的数据块的话就需要从磁盘中获取,于是就产生了‘physical reads‘。
Physical Reads通常是我们最关心的,如果这个值很高,说明要从磁盘请求大量的数据到Buffer Cache里,通常意味着系统里存在大量全表扫描的SQL语句,这会影响到数据库的性能,因此尽量避免语句做全表扫描,对于全表扫描的SQL语句,建议增 加相关的索引,优化SQL语句来解决。
关于physical reads ,db block gets 和consistent gets这三个参数之间有一个换算公式:
数据缓冲区的使用命中率=1 - ( physical reads / (db block gets + consistent gets) )。
用以下语句可以查看数据缓冲区的命中率:
SQL>SELECT name, value FROM v$sysstat WHERE name IN (‘db block gets‘, ‘consistent gets‘,‘physical reads‘);

 
redo size DML生成的redo的大小  执行SQL的过程中产生的重做日志  
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条数  通过网络客户端发送或接收的数量  
sorts (memory) 在内存执行的排序量  在内存中发生的排序  
sorts (disk) 在磁盘上执行的排序量  在硬盘中发生的排序  
rows processed 处理的数据的行数  处理的行数  

    2.5 动态分析

动态统计量收集是Oracle CBO优化器的一种特性。优化器生成执行计划是依据成本cost公式计算出的,如果相关数据表没有收集过统计量,又要使用CBO的机制,就会引起动态采样。
动态采样(dynamic sampling)就是在生成执行计划是,以一个很小的采用率现进行统计量收集。由于采样率低,采样过程快但是不精确,而且采样结果不会进入到数据字典中。
如果在执行计划中有如下提示:
Note
-------------dynamic sampling used for the statement
这提示用户CBO当前使用的技术,需要用户在分析计划时考虑到这些因素。 当出现这个提示,说明当前表使用了动态采样。 我们从而推断这个表可没有做过分析。
这里会出现两种情况:
(1) 如果表没有做过分析,那么CBO可以通过动态采样的方式来获取分析数据,也可以或者正确的执行计划。
(2) 如果表分析过,但是分析信息过旧,这时CBO就不会在使用动态采样,而是使用这些旧的分析数据,从而可能导致错误的执行计划。

三、JOIN方式
    3.1 hash join

    3.2 merge join

    3.3 nested loop

四、表访问方式
    4.1表访问方式---->全表扫描(Full Table Scans)
        表访问方式---->全表扫描(Full Table Scans, FTS)
    4.2表访问方式---->通过ROWID访问表(table access by ROWID)
        表访问方式---->通过ROWID访问表(table access by ROWID)
    4.3索引扫描
        索引范围扫描(INDEX RANGE SCAN)
        引唯一性扫描(INDEX UNIQUE SCAN)
        索引全扫描(INDEX FULL SCAN)
        索引快速扫描(index fast full scan)
        索引跳跃式扫描(INDEX SKIP SCAN)

 

 

 

 

 

Oracale执行计划学习

标签:索引范围扫描   导致   dex   gets   统计信息   height   reads   硬盘   信息   

原文地址:https://www.cnblogs.com/nliao/p/14289738.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!