热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OBA技能2Oracle执行计划顺序表连接

OBA技能1-获取执行计划OBA技能2-执行计划顺序小仙我在学习索引执行行为的时候,有

OBA技能1-获取执行计划

OBA技能2-执行计划顺序


小仙我在学习索引执行行为的时候,有个疑惑? 那就是索引是找到一个值就马上回表,然后再找下一个值,再回表。

比如索引唯一扫描,索引范围扫描,索引全扫描,索引快速扫描。好像都是要回表。尤其是范围,不范围完后,再回表呢?像下面的索引范围扫描

它不是把INDEX RANGE SCAN 执行完了后 再执行TABLE ACCESS BY INDEX ROWID。而是SCAN 一次,TABLE一次。这样要反复执行好多次,具体多少次,就看评估值Cardinatily 也就是ROW值。


而表连接是,是结果集的链接,换言之就是先把表要的数据找出来后,再跟后面的表关联。

那什么时候是一次一条数据,什么时候是一次全部数据呢?

这要看两个方面,

1 是操作方法;

2 是表连接方式;


所谓操作方法 就是上面说的过程。 比如说INDEX RANGE SCAN 就是一次返回一条数据,然后执行第二方法,回表找具体数据。有的方法 TABLE ACCESS FULL 全表扫描 它就是一次返回全部符合条件的数据。


表连接方法,常见的有3种分别是

1 NESTED LOOPS

2 HASH JOIN

3 SORT JOIN MERGE JOIN


第一个是嵌套循环关联,第二个是HASH,第三个SORT 排序。

第一个链接 类似于JAVA开发当中的 双循环

for a (i=1;i++;i<1000)

{

  x=y*z;

  for b( h=1;h++; h<10)

   {

     o=x*100;

   }

}

 先执行X=Y*Z 然后再执行内循环,外循环执行1000次,而内循环要执行10次,外乘以外循环次数 10*1000=10000次。

这图没有表现我要说的,我大致画一下

NESTED LOOPS

    TABLE ACCESS BY INDEX ROWID

            INDEX RANGE SCAN

     TABLE ACCESS FULL

这样的执行计划,NESTED LOOPS 不会等 外循环返回所有数据后去执行内循环 也就是TABLE ACCESS FULL。而是外循环返回1条记录,就执行一次内循环。而要是外循环是TABLE ACCESS FULL 那就必须等待外循环找完全部数据后才执行内循环。

所以这个NESTED LOOPS 是受到具体执行方法的影响。另外两种不受影响。


OBA常用术语叫驱动表,它就是指外循环,也就是先被执行的表,一般都是兄长级别的表。另外两个链接也是兄长级别当驱动表。


所以 驱动表 必须是小表,确切地说是返回结果集小的,也就是返回行数最少的。否则向上面的双循环列子样,外循环要执行1000次,而内循环执行10次,可内循环被外循环强制执行了1万次。

你要是说颠倒过来,内循环还是要执行1万次。可是总体来说是10次+1万次,而不颠倒过来是1000次+1万次。多了990次。


另外谈个顺序,在很多表关联的SQL中,表与表之间的关联是单向的,第一个表与第二个表关联后形成了结果集,保存在PGA的数据。然后再跟第三个表关联再形成结果集保留在PGA里,接着跟第4个表关联。

而不是第1个表与第2个表关联形成结果集1,然后第3个表与第4个表关联形成结果集2,最后结果集1和结果集2关联。执行计划不能被并行执行。


NESTED LOOPS 是两个表等值关联,返回少量数据;

HASH JOIN  是两个表等值关联,返回大量数据;

   HASH JOIN 会选择返回数据较少的表,把表的SELECT列和JOIN列放入PGA中,然后对另外个表的JOIN列进行HASH取值,然后再跟PGA的驱动表JOIN列进行匹配关联。


SORT MEGER JOIN 处理两个表非等值关联 >,>=,<,<=,<>.

 先对两个表根据JOIN列进行排序,选择数据较小的表作为驱动表,然后跟排好序的另外个表进行匹配。驱动表返回多少行,另外个表就要匹配多少次。

SELECT STATEMENT

MERGE JOIN

    TABLE ACCESS BY INDEX ROWID

            INDEX RANGE SCAN

    SORT JOIN

            TABLE ACCESS FULL

并且两个表的数据都要放进内存PGA进行匹配,如果内存放不下,就放到磁盘上。

所以这里全部数据提到内存进行匹配, 不受INDEX RANGE SCAN 单行的影响。


CARTESIAN JOIN 卡尔 ,这是两个表没有连接列造成的。

MEGER JOIN CARTESIAN 也是笛卡尔. 


SEMI JOIN 叫做半连接 两个表关联只返回1个表的数据,一般都是IN和EXISTS。会出现 MERGE JOIN SEMI,NESTEDLOOPS SEMI的执行方法。都属于半连接。


ANTI JOIN 是反连接。是NOT IN,NOT EXISTS,执行计划的方法名字带有ANTI 就是反连接,表现有 MERGE JOIN ANTI NA;NESTED LOOPS ANTI


FILTER 连接 FILTER这个字眼在执行计划有两个意思,1个就是过滤,另外一个是关联,类似于NESTED LOOPS。主要看FILTER下面是否有两个以上的儿子(后代)。

为啥不直接用NESTED LOOPS 表示呢?因为FILTER告诉你 其中子查询没有被展开。




推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Explain如何助力SQL语句的优化及其分析方法
    本文介绍了Explain如何助力SQL语句的优化以及分析方法。Explain是一个数据库SQL语句的模拟器,通过对SQL语句的模拟返回一个性能分析表,从而帮助工程师了解程序运行缓慢的原因。文章还介绍了Explain运行方法以及如何分析Explain表格中各个字段的含义。MySQL 5.5开始支持Explain功能,但仅限于select语句,而MySQL 5.7逐渐支持对update、delete和insert语句的模拟和分析。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
author-avatar
手机用户2502853601
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有