1. 连接说明

① Oracle一次只能连接两个表。不管查询中有多少个表,Oracle 在连接中一次仅能操作两张表。

② 当执行多个表的连接时,优化器从一个表开始,将它与另一个表连接;然后将中间结果与下一个表连接,以此类推,直到处理完所有表为止。

2. 连接方式

▶ 嵌套循环连接(NESTED LOOP JOIN)

▶ 排序合并连接(SORT MERGE JOIN)

▶ 哈希连接(HASH JOIN)

▶ 笛卡尔积连接(CARTESION JOIN )

2.1 NESTED LOOP JOIN

① Oracle优化器基于规则RBO或基于成本CBO的原则,选择两张表中的一张作为驱动表,驱动表也叫做外部表;再将另外一张表指定为外部表;

② Oracle从外部表中读取第一行,然后和内部表中的数据逐一对比,所有匹配的结果放在结果集中;

③ Oracle读取外部表中的第二行,然后和内部表中的数据逐一对比,所有匹配的结果放在结果集中;

④ 重复上面的步骤,直到外部表中的所有记录全部处理完,最后产生满足条件的结果集。

驱动表一般为根据where条件能得到的较小条件的结果表,而不一定是整个表记录比较小的小的表。

指定oralce优化器按照嵌套循环连接连接两个表

Select /*+ use_nl(a b)*/ a.* from a,b where a.col1=b.col1;

2.2 SORT MERGE JOIN

① Oracle优化器判断第一个源表是否已经排序,如果已经排序自动跳入下一步,否则对第一个源表排序;

② Oracle优化器判断第二个源表是否已经排序,如果已经排序自动跳入下一步,否则对第二个源表排序;

③ 已经排过序的两个源表进行合并操作,并生成最后的结果集。

通常情况下,散列连接的效果都比排序效果要好,然而如果行源已经被排过序,在执行排序连接时不需要再进行排序;或者where条件中是对两张表进行比较操作,那么排序合并连接优于散列连接。

指定oralce优化器按照排序合并连接连接两个表

Select /*+ use_merge(a b)*/ a.* from a,b where a.col1>b.col1;

2.3 HASH JOIN

当内存能够提供足够的空间时,HASH连接是优化器常做的选择,哈希连接中,优化器根据统计信息,首先选择两个表中的小表,在内存中建立基于这张表的基于连接键的HASH表;优化器再扫描连接表中的大表,将大表中的数据与哈希表中的数据进行比较,如果有相关联的数据,则将数据添加到结果集中。

当表连接中小表能完全cash到可用的内存时,哈希连接的效果最佳。哈希连接的成本只是两个表从硬盘读入到内存的成本。

如果哈希表过大不能完全cash到可用的内存时,优化器会把哈希表分成多个分区,再把这些分区逐一cash到内存中。当表的分区超过了可用内存时,分区的部分数据就会临时的写到磁盘的临时表空间上。

当哈希表构建完成后,还需要进行后面的操作

① 第二个大表进行扫描,如果大表不能完全cash到可用内存时,大表同样会被分为很多分区;

② 大表的第一个分区cash到内存,对大表的第一个分区数据进行扫描,并与哈希表的数据进行比较,如果有匹配的记录,添加到结果集里面;其他分区也做类似处理;

③ 当所有分区处理完成后,Oracle对产生的结果集进行汇总,归并,产生最终的结果。

这种连接方式适用于较小的表可以cash到内存的情况,

指定oralce优化器按照哈希连接连接两个表

Select /*+ use_hash(a b)*/ a.* from a,b where a.col1=b.col1;

2.4 CARTESTION JOIN

如果where条件中没有写出两张表的连接条件,优化器会把第一张表的每一条记录和第二章表的所有记录连接,生成结果集。很少用到。

Oracle 表的连接方式的更多相关文章

  1. Oracle 表的连接方式(2)-----HASH JOIN的基本机制2

    Hash算法原理 对于什么是Hash算法原理?这个问题有点难度,不是很好说清楚,来做一个比喻吧:我们有很多的小猪,每个的体重都不一样,假设体重分布比较平均(我们考虑到公斤级别),我们按照体重来分,划分 ...

  2. Oracle 表的连接方式(2)-----HASH JOIN的基本机制3

    HASH JOIN的模式 hash join有三种工作模式,分别是optimal模式,onepass模式和multipass模式,分别在v$sysstat里面有对应的统计信息: SQL> sel ...

  3. Oracle 表的连接方式(2)-----HASH JOIN的基本机制1

    我们对hash join的常见误解,一般包括两个: 第一个误解:是我们经常以为hash join需要对两个做join的表都做全表扫描 第二个误解:是经常以为hash join会选择比较小的表做buil ...

  4. Oracle 表的连接方式(1)-----Nested loop join和 Sort merge join

    关系数据库技术的精髓就是通过关系表进行规范化的数据存储,并通过各种表连接技术和各种类型的索引技术来进行信息的检索和处理. 表的三种关联方式: nested loop:从A表抽一条记录,遍历B表查找匹配 ...

  5. 转:ORACLE的JDBC连接方式:OCI和THIN

    oracle的jdbc连接方式:oci和thin oci和thin是Oracle提供的两套Java访问Oracle数据库方式. thin是一种瘦客户端的连接方式,即采用这种连接方式不需要安装oracl ...

  6. Oracle 三种连接方式 NESTED LOOP HASH JOIN SORT MERGE JOIN

    NESTED LOOP: 对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择.在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大( ...

  7. oracle 表空管理方式(LMT)、ASSM段管理方式、一级位图块、二级位图块、三级位图块。

    今天是2013-12-16,今天和明天是我学习oracle生涯中一个特殊的日子.今天晚上进行了一下表空间管理方式的学习,在此记录一下笔记. 对于oracle数据库最小i/0单位是数据块,最想分配空间单 ...

  8. Oracle 11g DRCP连接方式——基本原理

    学习Oracle是一个复杂.繁琐的过程.在浩如烟海的Oracle官方资料.新特性.MOS资料和各种Internal知识面前,我们总是觉得力不从心.不知所措.但是,这往往也就是我们不断坚持.积累和追寻的 ...

  9. SQLAlchemy(2):多表操作 & 连接方式及原生SQL

    一对多:ForeignKey multitb_models.py import datetime from sqlalchemy import create_engine # 引入 创建引擎 from ...

随机推荐

  1. SaltStack自动化安装配置haproxy

    准备环境node1:192.168.217.149 (saltstack master)node2:192.168.217.150(saltstack minion)下载haproxy1.6.2.ta ...

  2. C# JObject将json字符串转为json对象

    static void Main(string[] args) { string json = "{\"name\": \"测试\",\"m ...

  3. myeclipse-9.0安装svn客户端插件

    SVN插件配置到MyEclipse中的步骤 听语音 | 浏览:20471 | 更新:2015-01-09 10:26 | 标签:myeclipse 1 2 3 4 5 6 7 分步阅读 MyEclip ...

  4. jquery——选项卡

    下面是闭包做选项卡: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  5. jquery字符串数组转json字符串 C#json字符串转字符串list

    一.jquery字符串数组转json字符串 var str=['1','2','3']; var jsonText= JSON.stringify(str);//把一个对象转换成json字符串 str ...

  6. 《从0到1学习Flink》—— Flink 中几种 Time 详解

    前言 Flink 在流程序中支持不同的 Time 概念,就比如有 Processing Time.Event Time 和 Ingestion Time. 下面我们一起来看看这几个 Time: Pro ...

  7. PHP面试题基础问题

    1.对于大流量的网站,您采用什么样的方法来解决访问量问题? 首先,确认服务器硬件是否足够支持当前的流量 其次,优化数据库访问. 第三,禁止外部的盗链. 第四,控制大文件的下载. 第五,使用不同主机分流 ...

  8. Spring Cloud Ribbon负载均衡

    目录 一.简介 二.客户端负载均衡 三.RestTemplate详解 GET请求 POST请求 PUT请求 DELETE请求 一.简介 ​ Spring Cloud Ribbon是一个基于HTTP 和 ...

  9. 解决gradle下载慢的问题

    解决方法要做两部 一 打开用户主目录 linux平台/home/用户名/.gradle windows平台c:\Users\用户名\.gradle macos平台/Users/用户名/.gradle ...

  10. ElasticSearch:华为云搜索CSS 之POC操作记录

    2019/03/06 09:00 ES文档官方:https://support.huaweicloud.com/usermanual-es/es_01_0024.html 华为云区域:华北北京1 ES ...