热门标签 | 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告诉你 其中子查询没有被展开。




推荐阅读
  • 本文详细介绍了在MySQL中如何高效利用EXPLAIN命令进行查询优化。通过实例解析和步骤说明,文章旨在帮助读者深入理解EXPLAIN命令的工作原理及其在性能调优中的应用,内容通俗易懂且结构清晰,适合各水平的数据库管理员和技术人员参考学习。 ... [详细]
  • 解决JavaScript中法语字符排序问题
    在开发一个使用JavaScript、HTML和CSS的Web应用时,遇到从SQLite数据库中提取的法语词汇排序不正确的问题,特别是带重音符号的字母未按预期排序。 ... [详细]
  • GreenPlum采纳ShareNothing的架构,良好的施展了便宜PC的作用。自此IO不在是DW(datawarehouse)的瓶颈,相同网络的压力会大很多。然而GreenPlum的查问优化策略可能防止尽量少的网络替换。对于首次接触GreenPlum的人来说,必定耳目一新。 ... [详细]
  • 图数据库与传统数仓实现联邦查询使用CYPHER实现从关系数据库过滤时间序列指标一、MySQL得到研报实体在Oracle中的唯一ID二、Oracle中过滤时间序列数据三、CYPHER ... [详细]
  • 本文讨论了在 Oracle 10gR2 和 Solaris 10 64-bit 环境下,从 XMLType 列中提取数据并插入到 VARCHAR2 列时遇到的性能问题,并提供了优化建议。 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
  • 根据官方定义,RxJava是一种用于异步编程和可观察数据流的API。其核心特性在于流式处理能力和丰富的操作符支持。 ... [详细]
  • 本文探讨了在UIScrollView上嵌入Webview时遇到的一个常见问题:点击图片放大并返回后,Webview无法立即滑动。我们将分析问题原因,并提供有效的解决方案。 ... [详细]
  • 本文详细介绍了HashSet类,它是Set接口的一个实现,底层使用哈希表(实际上是HashMap实例)。HashSet不保证元素的迭代顺序,并且是非线程安全的。 ... [详细]
  • 近期在开发的一个项目中,预计数据量将在半年内突破千万条。为了提高查询性能,减少数据处理时间,我们决定采用Oracle数据库的分区功能。本文将详细介绍Oracle的List分区及其索引策略。 ... [详细]
  • ABP框架是ASP.NET Boilerplate的简称,它不仅是一个开源且文档丰富的应用程序框架,还提供了一套基于领域驱动设计(DDD)的最佳实践架构模型。本文将详细介绍ABP框架的特点、项目结构及其在Web API优先架构中的应用。 ... [详细]
  • 本文介绍了 Oracle SQL 中的集合运算、子查询、数据处理、表的创建与管理等内容。包括查询部门号为10和20的员工信息、使用集合运算、子查询的注意事项、数据插入与删除、表的创建与修改等。 ... [详细]
  • 在运行于MS SQL Server 2005的.NET 2.0 Web应用中,我偶尔会遇到令人头疼的SQL死锁问题。过去,我们主要通过调整查询来解决这些问题,但这既耗时又不可靠。我希望能找到一种确定性的查询模式,确保从设计上彻底避免SQL死锁。 ... [详细]
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
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社区 版权所有