oracle强制执行计划,OBA技能2-Oracle执行计划顺序表连接

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

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

a01e72c97f2effbbbb876f599c12cf22.png

它不是把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次。

1424a28a8e2f79ad2eb481a06551b6dc.png

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu中启动oracle数据库

前期准备&#xff1a;如果你还没有在ubuntu上安装oracle请先看我之前到日志http://blog.csdn.net/backtracker/article/details/66247181. $su oracle $ sqlplus /nolog 将出现如下连接数据库信息&#xff1a; SQL*Plus: Release 10.2.0.1.0 - Production on Fri Jul 8 10:1…

oracle 输出到页面,利用Xming 将Linux 图形界面输出到Windows上

Linux上安装Oracle 时需要图形界面, 但又不想在服务器上安装图形界面怎么办,这时候就需要用到Xming 这个神器了安装过程比较简单, 直接下一步下一步即可安装完成后先运行, Xlaunch注意:这个No Access Control的勾勾一定要勾上,否则 执行export到Windows主机上时会提示 No proto…

spring 事件模型_Spring–设计领域模型和服务层

spring 事件模型我们将为时间表管理构建应用程序。 因此&#xff0c;让我们首先考虑一些用例和实体。 让我用几个项目符号写它们&#xff1a; 任务由经理分配给员工。 一项任务可以分配给许多员工。 员工将他在某些任务上工作的小时数填充到系统中。 经理/员工查看时间表上的…

log4j/slf4j

log4j的使用 引入log4j.jar包<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version> </dependency> 配置log4j.propertieslog4j.rootLoggerINFO,Console,OneFile,errFile #输出到控制…

Ubuntu 12.04下安装Oracle Express 11gR2

Ubuntu 12.04下安装Oracle Express 11gR2 [我的笔记] 参考1&#xff1a;http://www.linuxidc.com/Linux/2012-09/71382.htm 参考2&#xff1a;http://zhjack.blog.163.com/blog/static/14314920137153331286/ 1、点击这里下载Oracle express的安装介质 Oracle Database Express…

选择的按钮:将ToggleButtons用作单选按钮

对于MQTT.fx&#xff0c;我想使用ToggleButtons例如选择MQTT消息或QoS级别的解码&#xff1a; 我发现在ToggleGroup的上下文中&#xff0c;ToggleButton在选择/取消选择方面的行为与RadioButtons不同&#xff1a;与RadioButtons不同&#xff0c;ToggleButtons仍可以设置为未选…

php调用image类提示不存在的字体,php – 无效的字体文件名(imagettfbox)

这个问题一直被问到,但是我找不到我问题的正确答案……作为一个小背景说明,在将类文件从/ application / lib / class移到/库之前,所有代码都运行良好/ class ……我试过玩GDFONTPATH,相对的,绝对路径有和没有文件扩展名无济于事.以下是我们迄今为止尝试的一些行&#xff1a;pu…

linux文件属性之用户和组基础知识

root :x :0 :0 :root :/root :/bin/bash 账号名称 &#xff1a;账号密码 &#xff1a;账号UID &#xff1a;账号组GID &#xff1a;用户说明 &#xff…

Oracle常用命令大全(经典收藏)

一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户&#xff0c;如下 su - oracle a、启动ORACLE系统 oracle>svrmgrl SVRMGR>connect internal SVRMGR>startup SVRMGR>quit b、关闭ORACLE系统 oracle>svrm…

oracle共享服务器模式的图,Oracle 11g笔记——专有服务器、共享服务器模式

专有服务器模式&#xff1a;适合批处理和大任务的应用共享服务器模式&#xff1a;适合有大量并发用户的应用共享服务器模式&#xff0c;处理过程&#xff1a;1、调度进程(Dispatcher)接受多个客户端(用户进程)的连接请求&#xff0c;并把这些请求放到一个公共队列中。2、空闲的…

基于django rest framework的mock server实践

网上找了一下mock server的实现&#xff0c;发现python的基本都是基于flask来实现的&#xff0c;因最近在学django&#xff0c;就尝试用drf实现了下&#xff1a; A brief introduction of sui_mock sui mock server is an attempt that aim at dealing some issues of the thir…

在Elasticsearch中索引Java Bean的简单方法

在数据存储方面&#xff0c;Java程序员习惯于使用魔术般持久的Java Bean。 诸如Hibernate和用于关系数据存储的JPA规范或Morphia和Spring Data MongoDB之类的解决方案是受欢迎的示例。 使用Elasticsearch的开发人员有时也有相同的愿望–传递Java bean并对其进行自动索引。 提供…

sturct stat 结构体中 st_mode 的含义

在<sys/stat.h>中定义的stat结构体内容如下&#xff1a; [cpp] view plaincopyprint? struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t…

MATLAB求解3对角系数矩阵方程,实验5.3 用追赶法求解三对角方程组

实验5.3 用追赶法求解三对角方程组实验目的会使用Matlab 语言编程使用追赶法求解线性方程组。实验原理设系数矩阵为三对角矩阵11222331110000000000000000n n n nn b c a b c a b A a b c a b ---?? ? ? ?? ? ?? ???则方程组Axf 称为三对角方程组。设矩阵A 非奇异&…

字符串操作以及打印 —— 实现上传下载的进度条功能

import sysdef processBar(num, total):rate num / totalrate_num int(rate * 100)if rate_num 100:r \r%s>%d%%\n % ( * rate_num, rate_num,)else:r \r%s>%d%% % ( * rate_num, rate_num,)sys.stdout.write(r)sys.stdout.flushprocessBar(10,100) 转载于:https://…

php去除每行的重复文本,php删除文本文件中重复行的方法

本文实例讲述了php删除文本文件中重复行的方法。分享给大家供大家参考。具体分析如下&#xff1a;这个php函数用来删除文件中的重复行&#xff0c;还可以指定是否忽略大小写&#xff0c;和指定换行符?1234567891011121314151617181920212223242526272829303132333435363738394…

Linux环境进程间通信(五): 共享内存(上)

Linux环境进程间通信&#xff08;五&#xff09;: 共享内存&#xff08;上&#xff09; 共享内存可以说是最有用的进程间通信方式&#xff0c;也是最快的IPC形式。两个不同进程A、B共享内存的意思是&#xff0c;同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即…

JS 跳出多重循环

今天学到了如何跳出多重循环 转载于:https://www.cnblogs.com/dmc-nero/p/9573971.html

jna 使用_使用JNA的透明JFrame

jna 使用在使JFrame透明中&#xff0c;我展示了一种使用AWTUtilities类使框架透明的方法。 但是使用该类会导致访问限制编译时错误&#xff0c;该文章中还显示了Eclipse中的解析。 现在&#xff0c;这里是使用Java本机的版本。 我使用Java本机访问&#xff08;JNA&#xff09;库…

通过命令查看linux 密码,linux查看用户密码(linux查看用户密码命令)

linux查看用户密码(linux查看用户密码命令)2020-05-15 13:18:30共10个回答1、用户名和密码的存储位置存储帐号的文件:/etc/passwd存储密码的文件:/etc/shadow2、可以使用cat、more、head、tail以及vim等命令查看或者修改,如下图所示:比如要查找系统中admin普通用户的密码,则执行…