Join Operations
? SORT-MERGE JOIN
– Sorts tables on the join key and then merges them together
– Sorts are expensive ? NESTED LOOPS
– Retrieves a row from one table and finds the corresponding rows in the other table
– Usually best for small numbers of rows ? HASH JOIN
– Build hash table in memory for smaller row source
– Hash larger row source
– Probe in-memory hash table for matches
– Hash joins are only considered by the CBO SORT-MERGE JOIN
根据关联列排序2个表,然后再进行merge操作
当然排序是很昂贵的
无驱动表概念 支持不等值连接 嵌套循环:
Oracle从较小结果集(驱动表/外部表)中读取一行,然后和较大结果集(被探查表/内部表)中的所有数据逐条进行比较(嵌套循环可以用于非等值连接),
如果符合规则,就放入结果集中,然后取较小结果集的下一条数据继续进行循环,直到结束。嵌套循环只适合输出少量结果集或者是用于快速输出结果集。 HASH JOIN
HASH JOIN 选择小表做驱动表,小表指的不是表的行数,而是指的是 行数*列宽度
HASH JOIN只能用于等值连接 把小的结果集(驱动表)来创建hash table 然后 HASH 大的结果集 探测内存里的Hash表来匹配: 实验SQL:
SELECT a.cur_code,b.int_sub_code,b.plan_int_sub_code, a.acct_bran_code , sum(a.payable_int_amt) as amt
FROM comr_intdist a,savc_buscode b
WHERE a.acct_flag = '1'
AND a.bus_code = b.bus_code
and a.LAST_MODI_DATE = '2013-12-31'
AND ((a.term = b.term
AND rtrim(a.sub_code) =rtrim(b.sub_code))
or
a.bus_code=77 )
GROUP BY a.cur_code,b.int_sub_code, b.plan_int_sub_code,a.acct_bran_code
; SORT-MERGE JOIN: Execution Plan
----------------------------------------------------------
Plan hash value: 3181909998 ----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8117 | 539K| | 20129 (2)| 00:04:02 |
| 1 | HASH GROUP BY | | 8117 | 539K| | 20129 (2)| 00:04:02 |
| 2 | MERGE JOIN | | 8117 | 539K| | 20127 (2)| 00:04:02 |
| 3 | SORT JOIN | | 409 | 10634 | | 6 (17)| 00:00:01 |
| 4 | TABLE ACCESS FULL | SAVC_BUSCODE | 409 | 10634 | | 5 (0)| 00:00:01 |
|* 5 | FILTER | | | | | | |
|* 6 | SORT JOIN | | 1136K| 45M| 139M| 20077 (2)| 00:04:01 |
|* 7 | TABLE ACCESS FULL| COMR_INTDIST | 1136K| 45M| | 7704 (2)| 00:01:33 |
---------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 5 - filter("A"."TERM"="B"."TERM" AND RTRIM("A"."SUB_CODE")=RTRIM("B"."SUB_CODE")
OR "A"."BUS_CODE"=77)
6 - access("A"."BUS_CODE"="B"."BUS_CODE")
filter("A"."BUS_CODE"="B"."BUS_CODE")
7 - filter("A"."ACCT_FLAG"='1' AND "A"."LAST_MODI_DATE"=TO_DATE(' 2013-12-31
00:00:00', 'syyyy-mm-dd hh24:mi:ss')) Statistics
----------------------------------------------------------
1 recursive calls
2 db block gets
27016 consistent gets
27000 physical reads
0 redo size
30923 bytes sent via SQL*Net to client
1147 bytes received via SQL*Net from client
59 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
860 rows processed 查看表的访问次数;
Plan hash value: 3181909998 ------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | OMem | 1Mem | Used-Mem |
------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 860 |00:00:07.55 | 27018 | 26880 | | | |
| 1 | HASH GROUP BY | | 1 | 8117 | 860 |00:00:07.55 | 27018 | 26880 | 835K| 835K| 1454K (0)|
| 2 | MERGE JOIN | | 1 | 8117 | 1131K|00:00:07.01 | 27018 | 26880 | | | |
| 3 | SORT JOIN | | 1 | 409 | 409 |00:00:00.01 | 21 | 0 | 55296 | 55296 |49152 (0)|
| 4 | TABLE ACCESS FULL | SAVC_BUSCODE | 1 | 409 | 409 |00:00:00.01 | 21 | 0 | | | |
|* 5 | FILTER | | 409 | | 1131K|00:00:06.65 | 26997 | 26880 | | | |
|* 6 | SORT JOIN | | 409 | 1136K| 5241K|00:00:04.55 | 26997 | 26880 | 66M| 2830K| 59M (0)|
|* 7 | TABLE ACCESS FULL| COMR_INTDIST | 1 | 1136K| 1138K|00:00:01.04 | 26997 | 26880 | | | |
------------------------------------------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id):
--------------------------------------------------- 5 - filter((("A"."TERM"="B"."TERM" AND RTRIM("A"."SUB_CODE")=RTRIM("B"."SUB_CODE")) OR "A"."BUS_CODE"=77))
6 - access("A"."BUS_CODE"="B"."BUS_CODE")
filter("A"."BUS_CODE"="B"."BUS_CODE")
7 - filter(("A"."ACCT_FLAG"='1' AND "A"."LAST_MODI_DATE"=TO_DATE(' 2013-12-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))) 34 rows selected. 嵌套循环: Execution Plan
----------------------------------------------------------
Plan hash value: 2053094138 ---------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8117 | 539K| 2283K (1)| 07:36:37 |
| 1 | HASH GROUP BY | | 8117 | 539K| 2283K (1)| 07:36:37 |
| 2 | NESTED LOOPS | | | | | |
| 3 | NESTED LOOPS | | 8117 | 539K| 2283K (1)| 07:36:37 |
|* 4 | TABLE ACCESS FULL | COMR_INTDIST | 1136K| 45M| 7704 (2)| 00:01:33 |
|* 5 | INDEX RANGE SCAN | SAVC_BUSCODE_IDX1 | 5 | | 1 (0)| 00:00:01 |
|* 6 | TABLE ACCESS BY INDEX ROWID| SAVC_BUSCODE | 1 | 26 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 4 - filter("A"."ACCT_FLAG"='1' AND "A"."LAST_MODI_DATE"=TO_DATE(' 2013-12-31 00:00:00',
'syyyy-mm-dd hh24:mi:ss'))
5 - access("A"."BUS_CODE"="B"."BUS_CODE")
6 - filter("A"."TERM"="B"."TERM" AND RTRIM("A"."SUB_CODE")=RTRIM("B"."SUB_CODE") OR
"A"."BUS_CODE"=77) Plan hash value: 2053094138 -------------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | OMem | 1Mem | Used-Mem |
-------------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 860 |00:00:16.87 | 290K| 26880 | | | |
| 1 | HASH GROUP BY | | 1 | 8117 | 860 |00:00:16.87 | 290K| 26880 | 835K| 835K| 1456K (0)|
| 2 | NESTED LOOPS | | 1 | | 1131K|00:00:15.90 | 290K| 26880 | | | |
| 3 | NESTED LOOPS | | 1 | 8117 | 5241K|00:00:06.74 | 27132 | 26880 | | | |
|* 4 | TABLE ACCESS FULL | COMR_INTDIST | 1 | 1136K| 1138K|00:00:00.88 | 26997 | 26880 | | | |
|* 5 | INDEX RANGE SCAN | SAVC_BUSCODE_IDX1 | 1138K| 5 | 5241K|00:00:03.59 | 135 | 0 | | | |
|* 6 | TABLE ACCESS BY INDEX ROWID| SAVC_BUSCODE | 5241K| 1 | 1131K|00:00:06.08 | 262K| 0 | | | |
------------------------------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 4 - filter(("A"."ACCT_FLAG"='1' AND "A"."LAST_MODI_DATE"=TO_DATE(' 2013-12-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss')))
5 - access("A"."BUS_CODE"="B"."BUS_CODE")
6 - filter((("A"."TERM"="B"."TERM" AND RTRIM("A"."SUB_CODE")=RTRIM("B"."SUB_CODE")) OR "A"."BUS_CODE"=77)) 32 rows selected. HASH JOIN:
Execution Plan
----------------------------------------------------------
Plan hash value: 4188551662 ------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8117 | 539K| 7768 (3)| 00:01:34 |
| 1 | HASH GROUP BY | | 8117 | 539K| 7768 (3)| 00:01:34 |
|* 2 | HASH JOIN | | 8117 | 539K| 7767 (3)| 00:01:34 |
| 3 | TABLE ACCESS FULL| SAVC_BUSCODE | 409 | 10634 | 5 (0)| 00:00:01 |
|* 4 | TABLE ACCESS FULL| COMR_INTDIST | 1136K| 45M| 7704 (2)| 00:01:33 |
------------------------------------------------------------------------------------ Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("A"."BUS_CODE"="B"."BUS_CODE")
filter("A"."TERM"="B"."TERM" AND
RTRIM("A"."SUB_CODE")=RTRIM("B"."SUB_CODE") OR "A"."BUS_CODE"=77)
4 - filter("A"."ACCT_FLAG"='1' AND "A"."LAST_MODI_DATE"=TO_DATE('
2013-12-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) Statistics
----------------------------------------------------------
1 recursive calls
2 db block gets
27016 consistent gets
26880 physical reads
0 redo size
37887 bytes sent via SQL*Net to client
1147 bytes received via SQL*Net from client
59 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
860 rows processed Plan hash value: 4188551662 ----------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | OMem | 1Mem | Used-Mem |
----------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 860 |00:00:05.11 | 27018 | 26880 | | | |
| 1 | HASH GROUP BY | | 1 | 8117 | 860 |00:00:05.11 | 27018 | 26880 | 835K| 835K| 1456K (0)|
|* 2 | HASH JOIN | | 1 | 8117 | 1131K|00:00:04.26 | 27018 | 26880 | 947K| 947K| 1257K (0)|
| 3 | TABLE ACCESS FULL| SAVC_BUSCODE | 1 | 409 | 409 |00:00:00.01 | 21 | 0 | | | |
|* 4 | TABLE ACCESS FULL| COMR_INTDIST | 1 | 1136K| 1138K|00:00:00.69 | 26997 | 26880 | | | |
---------------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("A"."BUS_CODE"="B"."BUS_CODE")
filter((("A"."TERM"="B"."TERM" AND RTRIM("A"."SUB_CODE")=RTRIM("B"."SUB_CODE")) OR "A"."BUS_CODE"=77))
4 - filter(("A"."ACCT_FLAG"='1' AND "A"."LAST_MODI_DATE"=TO_DATE(' 2013-12-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))) 30 rows selected.

sort merge join,hash join,netsloop join的更多相关文章

  1. Sort merge join、Nested loops、Hash join(三种连接类型)

    目前为止,典型的连接类型有3种: Sort merge join(SMJ排序-合并连接):首先生产driving table需要的数据,然后对这些数据按照连接操作关联列进行排序:然后生产probed ...

  2. Nested Loop,Sort Merge Join,Hash Join

    三种连接工作方式比较: Nested loops 工作方式是从一张表中读取数据,访问另一张表(通常是索引)来做匹配,nested loops适用的场合是当一个关联表比较小的时候,效率会更高. Merg ...

  3. Nested Loops,Hash Join 和 Sort Merge Join. 三种不同连接的不同:

    原文:https://blog.csdn.net/tianlesoftware/article/details/5826546 Nested Loops,Hash Join 和 Sort Merge ...

  4. Nested loops、Hash join、Sort merge join(三种连接类型原理、使用要点)

    nested loop 嵌套循环(原理):oracle从较小结果集(驱动表.也可以被称为outer)中读取一行,然后和较大结果集(被侦查表,也可以叫做inner)中的所有数据逐条进行比较(也是等值连接 ...

  5. NESTED LOOPS & HASH JOIN & SORT MERGE JOIN

    表连接方式及使用场合 NESTED LOOP 对于被连接的数据子集较小的情况,nested loop连接是个较好的选择.nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查 ...

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

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

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

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

  8. sort merge join导致temp被爆菊

    SQL_ID cqsz37256v36j, child number 1 ------------------------------------- INSERT /*+append*/ INTO T ...

  9. Merge join、Hash join、Nested loop join对比分析

    简介 我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge Join,Hash Join ...

随机推荐

  1. vs2012 aspx 没有设计视图了?

    vs2012的html设计视图没有了!重新安装一次都不行!现在已经通过简单办法来解决了 其实当你打开 HTML设计器 设置时, “启用 HTML设计器"  这里是打勾的!这时千万不要放弃.先 ...

  2. dumpbin.exe

    有时候我们想查看一个exe引用了哪些动态库,或者我们想看某个动态库包含哪些接口函数,这个时候可以使用dumpbin.exe工具: 1.输入Dumpbin -imports calldll.exe查看它 ...

  3. C++的MFC,与C#的.NET

    转载:http://blog.sina.com.cn/s/blog_7f5bde5c0101hk5n.html 以下摘自各问答网站.博客论坛: [1]MFC早已过时,现在C++多数是用来编写底层方法而 ...

  4. ViewPage实现幻灯广告墙

        ViewPage实现幻灯广告墙 功能简介 类似幻灯片功能 自动切换图片 触摸停止切换图片 自带标题功能和切换圆点 核心功能实现方法 1. 布局 <LinearLayout xmlns:a ...

  5. Android- Context理解

    学习了安卓以后还是不理解Context的用法:Api文档链接http://wear.techbrood.com/reference/android/content/Context.html 一个非常好 ...

  6. java - 异常浅谈

    java提供异常处理机制中,可以分为RuntimeException和checked Exception两种. RuntimeException 是运行时异常,是程序本身无法解决的.例如,对于一个用户 ...

  7. 如何:确定调用 ASP.NET 网页的方式

    如何:确定调用 ASP.NET 网页的方式 通常有必要了解调用 ASP.NET 网页的方式:是由原始请求 (HTTP GET).回发 (HTTP POST).来自其他页的跨页面发送 (HTTP POS ...

  8. hadoop_并行写操作思路

    这篇文章是关于,如何修改hadoop的src以实现在client端上传大文件到HDFS的时候, 为了提高上传的效率实现将文件划分成多个块,将块并行的写入到datanode的各个block中 的初步的想 ...

  9. 类库探源——System.Environment

    Environment 类: 提供有关当前环境和平台的信息以及操作它们的方法.此类不能被继承. 命名空间: System 程序集:   mscorlib.dll 继承关系: 常用属性(字段)和方法: ...

  10. 打印出不同顺序的字符串&单引号和双引号的差异

    发现一个很好玩的打印顺序 package com.liaojianya.chapter1; /** * This program demonstrates the string. * @author ...