首页 > 数据库 >执行计划】Oracle 11gR2使用Full outer Joins执行计划完成全外连接查询

执行计划】Oracle 11gR2使用Full outer Joins执行计划完成全外连接查询

时间:2024-04-02 15:45:40浏览次数:19  
标签:00 Full 11gR2 FULL 全外 01 SQL ---------- 15

1.创建实验表并初始化实验数据
sys@ora11g> select * from v$version;

BANNER
------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

conn sec/sec
create table a (a number(1),b number(1),c number(1));
create table b (a number(1),d number(1),e number(1));
insert into a values(1,1,1);
insert into a values(2,2,2);
insert into a values(3,3,3);
insert into b values(1,4,4);
insert into b values(2,5,5);
insert into b values(4,6,6);
commit;

2.两种实现全外连接查询的方法
1)第一种方法:使用两次外连接结合union的方法
select * from a,b where a.a=b.a(+)
union
select * from a,b where a.a(+)=b.a;

2)第二种方法:使用全外连接标准写法
select * from a full outer join b on a.a = b.a;

3.比较两种执行方法的执行计划
1)反复执行第一种方法得到稳定的执行计划
sec@ora11g> select * from a,b where a.a=b.a(+)
  2  union
  3  select * from a,b where a.a(+)=b.a;

         A          B          C          A          D          E
---------- ---------- ---------- ---------- ---------- ----------
         1          1          1          1          4          4
         2          2          2          2          5          5
         3          3          3
                                          4          6          6


Execution Plan
----------------------------------------------------------
Plan hash value: 891669117

-----------------------------------------------------------------------------
| Id  | Operation            | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |      |     6 |   468 |    15  (60)| 00:00:01 |
|   1 |  SORT UNIQUE         |      |     6 |   468 |    15  (60)| 00:00:01 |
|   2 |   UNION-ALL          |      |       |       |            |          |
|*  3 |    HASH JOIN OUTER   |      |     3 |   234 |     7  (15)| 00:00:01 |
|   4 |     TABLE ACCESS FULL| A    |     3 |   117 |     3   (0)| 00:00:01 |
|   5 |     TABLE ACCESS FULL| B    |     3 |   117 |     3   (0)| 00:00:01 |
|*  6 |    HASH JOIN OUTER   |      |     3 |   234 |     7  (15)| 00:00:01 |
|   7 |     TABLE ACCESS FULL| B    |     3 |   117 |     3   (0)| 00:00:01 |
|   8 |     TABLE ACCESS FULL| A    |     3 |   117 |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("A"."A"="B"."A"(+))
   6 - access("A"."A"(+)="B"."A")

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         28  consistent gets
          0  physical reads
          0  redo size
        792  bytes sent via SQL*Net to client
        419  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          4  rows processed

2)反复执行第二种方法得到稳定的执行计划
sec@ora11g> select * from a full outer join b on a.a = b.a;

         A          B          C          A          D          E
---------- ---------- ---------- ---------- ---------- ----------
         1          1          1          1          4          4
         2          2          2          2          5          5
                                          4          6          6
         3          3          3


Execution Plan
----------------------------------------------------------
Plan hash value: 3456740935

----------------------------------------------------------------------------------
| Id  | Operation             | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |          |     3 |   234 |     7  (15)| 00:00:01 |
|   1 |  VIEW                 | VW_FOJ_0 |     3 |   234 |     7  (15)| 00:00:01 |
|*  2 |   HASH JOIN FULL OUTER|          |     3 |   234 |     7  (15)| 00:00:01 |
|   3 |    TABLE ACCESS FULL  | A        |     3 |   117 |     3   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL  | B        |     3 |   117 |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("A"."A"="B"."A")

Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         15  consistent gets
          0  physical reads
          0  redo size
        792  bytes sent via SQL*Net to client
        419  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          4  rows processed

3)执行计划对比结果
第一种外连接结合union方法对表进行了两次扫描,而全外连接方法引入了HASH JOIN FULL OUTER执行计划仅需对表进行一次扫描便得到了查询结果。从consistent gets上也很直观,全外连接写法(28)比union方法(15)的consistent gets少了一半。

4.小结
  Oracle对全外连接的支持越来越好,从最初Oracle不支持全外连接的SQL写法,到支持SQL的特定写法,同时从执行计划上也在逐渐优化中。

标签:00,Full,11gR2,FULL,全外,01,SQL,----------,15
From: https://www.cnblogs.com/ivenlin/p/18110711

相关文章

  • Communications link failureThe last packet successfully received from the server
    出现这种错误的大致情况如下:网络问题:可能存在网络中断、网络延迟或者网络拥塞等问题,导致应用程序无法与数据库建立稳定的连接。可以通过检查网络连接是否稳定来解决这个问题。数据库服务器问题:数据库服务器可能出现了问题,例如数据库服务未启动、数据库服务器资源不足、数......
  • Minor GC、Major GC、Full GC
    转载自:https://blog.csdn.net/xiaojin21cen/article/details/87779487https://blog.csdn.net/zs18753479279/article/details/119341774=====================  Java7及以前版本的Hotspot中方法区位于永久代中。同时,永久代和堆是相互隔离的,但它们使用的物理内存是连续的......
  • MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案
    解决方案一:使用函数ANY_VALUE()包含报错字段SELECTANY_VALUE(ID),USER_ID,ANY_VALUE(problems),ANY_VALUE(last_updated_date)FROMt_iov_help_feedbackGROUPBYUSER_ID; 解决方案二:通过sql语句暂时性修改sql_mode去掉ONLY_FULL_GROUP_BY,重新设置SET@@global.sql_m......
  • MYSQL语法:左连接、右连接、内连接、全外连接
    概念leftjoin(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。rightjoin(右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。innerjoin(内连接):只返回两个表中连接字段相等的行。fulljoin(全外连接):返回左右表中所有的记录和左右表中连接字段相等的记录......
  • 线上FullGC问题排查实践
    一、问题发现与排查1.1找到问题原因问题起因是我们收到了jdos的容器CPU告警,CPU使用率已经达到104%观察该机器日志发现,此时有很多线程在执行跑批任务。正常来说,跑批任务是低CPU高内存型,所以此时考虑是FullGC引起的大量CPU占用(之前有类似情况,告知用户后重启应用后解决......
  • FullGC详解
    前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解释器。 它提供了一种独立于操作系统的运行环境,使得Java程序在任何支持JVM的计算机上都可以运行。JVM负责加载、验证、解释、执行和垃圾回收Java字节代码,并为......
  • Python numpy.full函数方法的使用
    ​ NumPy(NumericalPython的缩写)是一个开源的Python科学计算库。使用NumPy,就可以很自然地使用数组和矩阵。NumPy包含很多实用的数学函数,涵盖线性代数运算、傅里叶变换和随机数生成等功能。本文主要介绍一下NumPy中full方法的使用。参考文档:Pythonnumpy.full函数方法的使用-CJ......
  • Failed to execute ‘requestFullscreen‘ on ‘Element‘
    来源:http://www.shanhubei.com/archives/13628.html浏览器无法自启动全屏模式报错信息:Failedtoexecute‘requestFullscreen’on‘Element’:APIcanonlybeinitiatedbyausergesture.翻译:无法在element上执行requestFullscreen方法,这个API只有用户主动行为才可以触发......
  • PowerShell 中使用相关命令管理 FFU(Full Flash Update)映像
    PowerShell中使用相关命令管理FFU(FullFlashUpdate)映像的示例:获取系统中的Windows映像信息:powershellCopyCodeGet-WindowsImage挂载指定的Windows映像:powershellCopyCodeMount-WindowsImage-ImagePath"C:\path\to\image.ffu"-Index1-Path"C:\mount"......
  • 详解module ‘yaml‘ has no attribute ‘FullLoader‘
    详解module'yaml'hasnoattribute'FullLoader'在使用Python中的YAML库进行解析操作时,可能会遇到类似于module'yaml'hasnoattribute'FullLoader'的错误。这个错误通常是由于不同版本的PyYAML库之间的差异导致的。在本篇文章中,我们将详细解释这个问题的原因,并提供一些解决方......