当前位置:  数据库>oracle

Oracle排序合并连接

    来源: 互联网  发布时间:2017-05-17

    本文导语: 为了弥补嵌套循环连接的不足,即在连接数据量比较大时,为了缩减嵌套循环连接中的大量随机读取,以及连接列不存在索引时,可以替代嵌套循环连接。 但是为了实现表连接,它必须要先对两个表中的将要执行连接的行进行...

为了弥补嵌套循环连接的不足,即在连接数据量比较大时,为了缩减嵌套循环连接中的大量随机读取,以及连接列不存在索引时,可以替代嵌套循环连接。

但是为了实现表连接,它必须要先对两个表中的将要执行连接的行进行排序。虽然这种方式提高了连接效率,但由于排序的存在,增加了连接的代价。如果能够快速的完成排序操作(排序内存空间大小(sort_area_size),并行),那么在处理大数据量时,排序合并连接将是不错的选择。

如果在连接列上有索引,并且利用该索引读取数据,由于索引是有序的,可以消除外部行源的排序操作。

排序合并连接没有嵌套循环连接中驱动表的概念。

  • SQL> createtable t1 asselect * from dba_objects;
  • 表已创建。
  • SQL> createtable t2 asselect * from dba_objects;
  • 表已创建。
  • SQL> set autot traceonly
  • SQL> set linesize 120
  • SQL> select /*+ use_merge(t1,t2) +*/ t1.object_id,t1.object_name,t2.object_name
  • 2 from t1,t2
  • 3 where t1.object_id=t2.object_id;
  • 已选择50425行。
  • 执行计划
  • ----------------------------------------------------------
  • Plan hash value: 412793182
  • ------------------------------------------------------------------------------------
  • | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
  • ------------------------------------------------------------------------------------
  • | 0 | SELECT STATEMENT | | 53430 | 8244K| | 2379 (2)| 00:00:29 |
  • | 1 | MERGE JOIN | | 53430 | 8244K| | 2379 (2)| 00:00:29 |
  • | 2 | SORT JOIN | | 53430 | 4122K| 9304K| 1152 (2)| 00:00:14 |
  • | 3 | TABLE ACCESS FULL| T1 | 53430 | 4122K| | 161 (2)| 00:00:02 |
  • |* 4 | SORT JOIN | | 57436 | 4431K| 9M| 1227 (2)| 00:00:15 |
  • | 5 | TABLE ACCESS FULL| T2 | 57436 | 4431K| | 161 (2)| 00:00:02 |
  • ------------------------------------------------------------------------------------
  • Predicate Information (identified by operation id):
  • ---------------------------------------------------
  • 4 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
  • filter("T1"."OBJECT_ID"="T2"."OBJECT_ID")
  • Note
  • -----
  • - dynamic sampling used for this statement
  • 统计信息
  • ----------------------------------------------------------
  • 0 recursive calls
  • 0 db block gets
  • 1396 consistent gets
  • 0 physical reads
  • 0 redo size
  • 3166055 bytes sent via SQL*Net to client
  • 37356 bytes received via SQL*Net from client
  • 3363 SQL*Net roundtrips to/from client
  • 2 sorts (memory)
  • 0 sorts (disk)
  • 50425 rows processed
  • SQL> createindex ind_t1_object_id on t1(object_id);
  • 索引已创建。
  • SQL> createindex ind_t2_object_id on t2(object_id);
  • 索引已创建。
  • /**由于索引是有序的,可以消除外部行源的排序操作*/
  • SQL> select /*+ use_merge(t1,t2) +*/ t1.object_id,t1.object_name,t2.object_name
  • 2 from t1,t2
  • 3 where t1.object_id=t2.object_id ;
  • 已选择50425行。
  • 执行计划
  • ----------------------------------------------------------
  • Plan hash value: 3739185171
  • ---------------------------------------------------------------------------------------------------------
  • | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
  • ---------------------------------------------------------------------------------------------------------
  • | 0 | SELECT STATEMENT | | 53430 | 8244K| | 2031 (1)| 00:00:25 |
  • | 1 | MERGE JOIN | | 53430 | 8244K| | 2031 (1)| 00:00:25 |
  • | 2 | TABLE ACCESS BYINDEX ROWID| T2 | 57436 | 4431K| | 879 (1)| 00:00:11 |
  • | 3 | INDEXFULL SCAN | IND_T2_OBJECT_ID | 57436 | | | 125 (2)| 00:00:02 |
  • |* 4 | SORT JOIN | | 53430 | 4122K| 9304K| 1152 (2)| 00:00:14 |
  • | 5 | TABLE ACCESS FULL | T1 | 53430 | 4122K| | 161 (2)| 00:00:02 |
  • ---------------------------------------------------------------------------------------------------------
  • Predicate Information (identified by operation id):
  • ---------------------------------------------------
  • 4 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
  • filter("T1"."OBJECT_ID"="T2"."OBJECT_ID")
  • Note
  • -----
  • - dynamic sampling used for this statement
  • 统计信息
  • ----------------------------------------------------------
  • 8 recursive calls
  • 0 db block gets
  • 8384 consistent gets
  • 117 physical reads
  • 0 redo size
  • 3166055 bytes sent via SQL*Net to client
  • 37356 bytes received via SQL*Net from client
  • 3363 SQL*Net roundtrips to/from client
  • 3 sorts (memory)
  • 0 sorts (disk)
  • 50425 rows processed
  • SQL> select /*+ use_merge(t1,t2) index(t1 ind_t1_object_id) +*/ t1.object_id,t1.object_name,t2.object_name
  • 2 from t1,t2
  • 3 where t1.object_id=t2.object_id ;
  • 已选择50425行。
  • 执行计划
  • ----------------------------------------------------------
  • Plan hash value: 3856170417
  • ---------------------------------------------------------------------------------------------------------
  • | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
  • ---------------------------------------------------------------------------------------------------------
  • | 0 | SELECT STATEMENT | | 53430 | 8244K| | 2107 (1)| 00:00:26 |
  • | 1 | MERGE JOIN | | 53430 | 8244K| | 2107 (1)| 00:00:26 |
  • | 2 | TABLE ACCESS BYINDEX ROWID| T1 | 53430 | 4122K| | 881 (1)| 00:00:11 |
  • | 3 | INDEXFULL SCAN | IND_T1_OBJECT_ID | 53430 | | | 125 (2)| 00:00:02 |
  • |* 4 | SORT JOIN | | 57436 | 4431K| 9M| 1227 (2)| 00:00:15 |
  • | 5 | TABLE ACCESS FULL | T2 | 57436 | 4431K| | 161 (2)| 00:00:02 |
  • ---------------------------------------------------------------------------------------------------------
  • Predicate Information (identified by operation id):
  • ---------------------------------------------------
  • 4 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
  • filter("T1"."OBJECT_ID"="T2"."OBJECT_ID")
  • Note
  • -----
  • - dynamic sampling used for this statement
  • 统计信息
  • ----------------------------------------------------------
  • 7 recursive calls
  • 0 db block gets
  • 8386 consistent gets
  • 0 physical reads
  • 0 redo size
  • 3166055 bytes sent via SQL*Net to client
  • 37356 bytes received via SQL*Net from client
  • 3363 SQL*Net roundtrips to/from client
  • 3 sorts (memory)
  • 0 sorts (disk)
  • 50425 rows processed
  • SQL> select /*+ use_merge(t1,t2) index(t1 ind_t1_object_id) index(t2 ind_t2_object_id) +*/ t1.object_id,t1.object_name,
  • 2.object_name
  • 2 from t1,t2
  • 3 where t1.object_id=t2.object_id ;
  • 已选择50425行。
  • 执行计划
  • ----------------------------------------------------------
  • Plan hash value: 3655247094
  • ----------------------------------------------------------------------------------------------------------
  • | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
  • ----------------------------------------------------------------------------------------------------------
  • | 0 | SELECT STATEMENT | | 53430 | 8244K| | 2750 (1)| 00:00:34 |
  • | 1 | MERGE JOIN | | 53430 | 8244K| | 2750 (1)| 00:00:34 |
  • | 2 | TABLE ACCESS BYINDEX ROWID | T2 | 57436 | 4431K| | 879 (1)| 00:00:11 |
  • | 3 | INDEXFULL SCAN | IND_T2_OBJECT_ID | 57436 | | | 125 (2)| 00:00:02 |
  • |* 4 | SORT JOIN | | 53430 | 4122K| 9304K| 1872 (1)| 00:00:23 |
  • | 5 | TABLE ACCESS BYINDEX ROWID| T1 | 53430 | 4122K| | 881 (1)| 00:00:11 |
  • | 6 | INDEXFULL SCAN | IND_T1_OBJECT_ID | 53430 | | | 125 (2)| 00:00:02 |
  • ----------------------------------------------------------------------------------------------------------
  • Predicate Information (identified by operation id):
  • ---------------------------------------------------
  • 4 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
  • filter("T1"."OBJECT_ID"="T2"."OBJECT_ID")
  • Note
  • -----
  • - dynamic sampling used for this statement
  • 统计信息
  • ----------------------------------------------------------
  • 7 recursive calls
  • 0 db block gets
  • 8551 consistent gets
  • 0 physical reads
  • 0 redo size
  • 3166055 bytes sent via SQL*Net to client
  • 37356 bytes received via SQL*Net from client
  • 3363 SQL*Net roundtrips to/from client
  • 3 sorts (memory)
  • 0 sorts (disk)
  • 50425 rows processed

  •     
     
     
     
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 网间Oracle的连接,远程连接Oracle服务器??
  • oracle远程连接服务器出现 ORA-12170 TNS:连接超时 解决办法
  • 不想装oracle却还要在redhat8.0下用jdbc连接oracle如何实现?
  • 我用JBuilder 7连接局域网内一ORACLE 9( 在本机可以连接)的问题?
  • 关于JDBC连接Oracle数据库,是否必须有Oracle客户端
  • oracle 数据库连接分析
  • Linux系统下利用java连接Oracle 10G
  • Jbuilder 7.0 连接 Oracle 数据库
  • 怎么直接通过JDBC连接oracle?
  • 请教: Javaswing 和 Oracle JDBC thin 连接的问题
  • opendbx 为什么连接不上oracle?
  • 100分寻求最优化的连接oracle的java程序,请给我讲出理由,我是初学者,在做项目时不想让连接oracle影响我的程序性能
  • 如何在JBuilder中连接Oracle数据库?
  • 怎样调出ORACLE数据库中的数据,该如何连接?
  • 请教JSP与ORACLE连接问题。
  • jdbc连接oracle
  • 关于Jbuilder7连接oracle9??
  • 再问java 连接oracle 问题,急!
  • jsp文件连接oracle失败
  • 讨论:jdbc连接oracle数据库
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,