表的连接方式:NESTED LOOP、HASH JOIN、SORT MERGE JOIN【转】
表连接方式及使用场合
NESTED LOOP
对于被连接的数据子集较小的情况,nested loop连接是个较好的选择。nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查找,没有索引一般就不会是 nested loops。
一般在nested loop中, 驱动表满足条件结果集不大,被驱动表的连接字段要有索引,这样就走nstedloop。如果驱动表返回记录太多,就不适合nested loops了。如果连接字段没有索引,则适合走hash join,因为不需要索引。
可用ordered提示来改变CBO默认的驱动表,可用USE_NL(table_name1 table_name2)提示来强制使用nested loop。
HASH JOIN
hash join是CBO 做大数据集连接时的常用方式。优化器扫描小表(或数据源),利用连接键(也就是根据连接字段计算hash 值)在内存中建立hash表,然后扫描大表,每读到一条记录就来探测hash表一次,找出与hash表匹配的行。
当小表可以全部放入内存中,其成本接近全表扫描两个表的成本之和。如果表很大不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O 的性能。临时段中的分区都需要换进内存做hash join。这时候成本接近于全表扫描小表+分区数*全表扫描大表的代价和。
至于两个表都进行分区,其好处是可以使用parallel query,就是多个进程同时对不同的分区进行join,然后再合并。但是复杂。
使用hash join时,HASH_AREA_SIZE初始化参数必须足够的大,如果是9i,Oracle建议使用SQL工作区自动管理,设置WORKAREA_SIZE_POLICY 为AUTO,然后调整PGA_AGGREGATE_TARGET即可。
以下条件下hash join可能有优势:
两个巨大的表之间的连接。
在一个巨大的表和一个小表之间的连接。
可用ordered提示来改变CBO默认的驱动表,可用USE_HASH(table_name1 table_name2)提示来强制使用hash join。
SORT MERGE JOIN
sort merge join的操作通常分三步:对连接的每个表做table access full;对table access full的结果进行排序;进行merge join对排序结果进行合并。sort merge join性能开销几乎都在前两步。一般是在没有索引的情况下,9i开始已经很少出现了,因为其排序成本高,大多为hash join替代了。
通常情况下hash join的效果都比sort merge join要好,然而如果行源已经被排过序,在执行sort merge join时不需要再排序了,这时sort merge join的性能会优于hash join。
在全表扫描比索引范围扫描再通过rowid进行表访问更可取的情况下,sort merge join会比nested loops性能更佳。
可用USE_MERGE(table_name1 table_name2)提示强制使用sort merge join。
本文来自:http://hi.baidu.com/fancy_wly/blog/item/07b0092ad7b73f3c5243c1b4.html
转载于:https://www.cnblogs.com/Godblessyou/archive/2010/07/17/1779521.html
表的连接方式:NESTED LOOP、HASH JOIN、SORT MERGE JOIN【转】相关推荐
- 表的连接方式:NESTED LOOP、HASH JOIN、SORT MERGE JOIN
表连接方式及使用场合 NESTED LOOP 对于被连接的数据子集较小的情况,nested loop连接是个较好的选择.nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查 ...
- oracle 非等值关联 优化,Oracle优化器、优化模式、表的连接方式(Hash Join、Nested Loop、Sort Merge Join)...
查询优化器 Oracle的查询优化器(QO)分为两种: 1. RBO:Ruled-Based Optimization, 基于规则的优化器: 2. CBO :Cost-Based Optimizati ...
- Oracle 表的连接方式(1)-----Nested loop join和 Sort merge join
关系数据库技术的精髓就是通过关系表进行规范化的数据存储,并通过各种表连接技术和各种类型的索引技术来进行信息的检索和处理. 表的三种关联方式: nested loop:从A表抽一条记录,遍历B表查找匹配 ...
- Nested Loop,Sort Merge Join,Hash Join
三种连接工作方式比较: Nested loops 工作方式是从一张表中读取数据,访问另一张表(通常是索引)来做匹配,nested loops适用的场合是当一个关联表比较小的时候,效率会更高. Merg ...
- 排序合并连接(sort merge join)的原理
这三类表连接方式是oracle最基本的连接方式: 嵌套循环连接(nested loops join)原理 哈希连接(hash join) 原理 排序合并连接(sort merge join) ...
- TiDB 源码阅读系列文章(十五)Sort Merge Join
2019独角兽企业重金招聘Python工程师标准>>> 什么是 Sort Merge Join 在开始阅读源码之前, 我们来看看什么是 Sort Merge Join (SMJ),定 ...
- MYSQL表的连接方式
mysql表连接方式可以分为 1.内连接 2.外连接 3.全连接 4.交叉连接 t1表 ...
- oracle join 嵌套,誰能真正理解hash join/nested loop/merge join
关于这三种JOIN的理解.Nested loop join,Hash join,Sort merge join Nested loop join: 步骤:确定一个驱动表(outer table),另一 ...
- 多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP
在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式. 之前打算在sqlplus中用执行计划的,但是格式看起来有点乱,就用Toad 做了3个截图. 从3张图里我们看到了几点 ...
最新文章
- java源码-AQS机制
- C#中使用Newtonsoft.Json实现对Json字符串的解析
- 百度地图API : 修改marker图标(icon)
- Java OutputStreamWriter close()方法与示例
- c#获取对象的唯一标识_DDD领域驱动设计实战 - 创建实体身份标识的常用策略
- php获取表单ip,PHP获取用户IP代码实现
- RHEL7.0 防火墙入门
- 1013-----C语言----------几个va_宏函数的使用
- 一个获取随机字符串的函数
- 11部门公布第三批111个国家新型城镇化综合试点名单和工作方案
- vue 点击某一行的按钮,获取当前行的数据
- 华为快应用接入广告服务开发指导
- RTSP支持MPEG-4格式监控
- 全国青少年编程等级考试python二级真题2020年9月(含题库答题软件账号)
- Cocos Creator:高效率内容生产,引领全平台制霸!
- 【BZOJ3168】[Heoi2013]钙铁锌硒维生素 高斯消元求矩阵的逆+匈牙利算法
- 火狐开发----Web开发者工具
- bootstrap进度条媒体对象和Well组件
- 常用的协议端口号(TCP and UDP)
- wincc历史数据库_wincc查询历史报警记录,归档数据
热门文章
- ios html字符串 label,iOS UIlabel怎么加载html字符串 富文本的用法
- fifo的valid信号啥时候为高_五角枫啥时候适合移栽?五角枫移栽最佳时间
- html如何设置三列列宽相等,CSS分割宽度100%到3列
- python把模块装到文件夹中_把模块有关联的放在一个文件夹中 在python2中调用文件夹名会直接失败 在python3中调用会成功,但是调用不能成功的解决方案...
- 默认文献工具_如何在浩瀚的Pubmed中快速找到自己需要的文献?分享一个小工具!...
- Spring Boot 自定义属性值
- inno setup 中文乱码问题_解决Inno Setup制作中文安装包在非中文系统上显示乱码的问题...
- 2021年下半年网络工程师上午真题及答案解析
- vue 导入excel解析_VUE中导入excel文件
- python高阶函数map_简单了解python高阶函数map/reduce