看懂Oralce执行计划

一、看懂Oracle的执行计划
1.执行顺序
    根据Operation缩进来判断,缩进最多的最先执行(当缩进相同时,最上面的最先执行)
2.表访问的方式
(1).TABLE ACCESS FULL(全表扫描)
读取表中所有的行,并检查每一行是否满足SQL语句的Where限制条件;全表扫描时可以使用多块读(即一次I/O读取多块数据块,Oracle存储逻辑结构:块-->区-->段-->表空间-->数据库)操作,提升吞吐量。
使用场景:数据量太大的表不建议使用全表扫描,除非本身需要取出的数据很多,占到全表数据的10%以上。
 
(2).TABLE ACCESS BY ROWID(通过ROWID的表存取)
什么是ROWID?在数据库中表的每行最后一列是伪列,可以使用它,但是不能对它的值进行增删改操作。每当插入一条数据时,就会产生对应的ROWID陪伴这条数据的整个生命周期,就是发生行迁移(高水位线的操作涉及到行迁移),该行的ROWID也不会发生变化。
而在TABLE ACCESS BY ROWID的扫描方式中,行的ROWID就对应该行所在的数据文件、数据块以及行在数据块中的位置(在索引中也是指向物理地址-16进制),可以通过ROWID快速定位到目标数据上,这就是在Oracle中最快获取单行数据的方法!
 
(3).TABLE ACCESS BY INDEX SCAN(索引扫描)
在索引块中,不仅存储这每个索引的键值,也存储这该键值行的ROWID。
如图所示的B数存储方式:
其实索引扫描分为两步:
I:扫描索引得到对应的ROWID
II:通过ROWID定位到具体的行读取数据
 
3.表的连接方式
先要搞懂表与表之间是用什么连接的,JOIN关键字用于两张表之间的连接,一次也只能连接两张表,JOIN操作的步骤一般是串行的,就是说两张表数据并行读取。表之间的连接顺序对查询效率有很大的影响,这里有两个概念:A.驱动表(Driving Table)、B.匹配表(Probed Table)
驱动表(Driving Table)和匹配表(Probed Table)
驱动表(Driving Table):就是通常意义上讲的主表,是首先读取数据的表,又称为外层表。这种概念用于NESTED LOOPS(嵌套循环) 与 HASH JOIN(哈希连接)中
在实际编写中,驱动表如果返回的数据较多,那么多后续的操作会产生负面影响,所以一般选用小表(本身数据少或者经过where条件后返回数据较少的表)作为驱动表。
匹配表(Probed Table):又称为内层表,从驱动表获取一行数据后,会到匹配表中寻找符合连接条件的数据,所以该表一般都大表(数据量较大或者经过where条件后返回数据较多的表)
 
表之间的连接方式是由CBO解决的,依赖统计信息?
(1)SORT MERGE JOIN(排序-合并连接)
通常在以下情况下,才会发生排序合并连接:
  • RBO模式
  • 不等值连接(>、<、<=、>=)
  • 哈希连接被禁用是(_HASH_JOIN_ENABLED=false)
  • 数据源已经排序(子查询中已经做好排序操作)
在排序-合并连接中,如果事先对连接关联列进行排序,会提高查询效率,因为排序时费时间和资源的操作,尤其对于大数据量的表,从我的理解上来看排序连接操作在目前的工作中不建议使用,数据量都不小,太过费时间和耗费资源。
(2) NESTED LOOPS(嵌套循环)    
    例如两张表A和B,其内部连接过程是:
  • 取出A表的row1(第一行),去遍历B表的所有行并检查是否有匹配的,取出的数据放在结果集中
  • 取出A表的row1(第二行),去遍历B表的所有行并检查是否有匹配的,取出的数据放在结果集中
  • ....................
     在嵌套连接中,尽可能的使用where条件来限制驱动表返回的行数,可以在匹配表的连接关联列上建立唯一索引或者选择性较好的非唯一索引,这样会提高嵌套循环的执行效率。
 
适用场景:
  • 快速返回第一批记录最快速的方法
  • 关联中外表或者驱动表比较小
  • 匹配表的关联字段有索引
(3)HASH JOIN(哈希连接)
在哈希连接中只适用于等值连接(连接条件为=),这也是平时用到最多的连接方式。
  • 取出驱动表的数据集,对其构建成内存中的HASH TABLE,创建Hash位图
  • 取出匹配表的数据集,对其中的每一条数据的连接操作关联列使用相同的Hash函数并找第一步里的对应值在HASH TABLE中的位置,在该位置检查能否找到匹配的数据??
适用场景:
  • 两个表的数据量很大
  • 一个大表和一个小表之间的连接
  • 表上没有索引(驱动表上没有索引,CBO不会考虑适用Nested Loop嵌套连接)
  • 返回的结果集比较大
  • 等值连接
   Hash Join是CBO做大数据集连接时最常用的方法
 
 

猜你喜欢

转载自www.cnblogs.com/WineMan/p/12192394.html