zoukankan      html  css  js  c++  java
  • Oracle中表的连接类型

    Oracle中所谓表的连接,有两种含义。一种是根据Oracle内部的连接判断方式区分的内部连接类型,这会影响到系统优化、资源占用等问题。另一种是基于查询的方式,对两张表之间建立联系,会影响到查询的结果,这里都写一下。

    一、Oracle 中的表内部连接有 3类 :

     

    1、 嵌套循环连接( Nested Loops )

        原理:扫描一个表,每读取驱动表的一条记录,就根据索引去另一个表里面查找,所有匹配记录放在结果集中,然后再读取驱动表的下一行。没有索引一般就不会是 nested loops 。

        条件:驱动表结果集不大,被驱动表连接字段要有索引。

        特点:使用嵌套循环连接是从连接结果中提取第一批记录的最快速方法。

        使用: USE_NL(t1 t2) 提示来强制执行 Nested Loops 。

     

    2、 哈希连接( Hash Join )

        原理:优化器先扫描小表,根据连接键在内存中建立 hash 表,然后扫描大表,每得到一条记录就探测 hash 表一次,找出匹配行。

        条件:两个巨大表之间的连接,或一个巨大的表一个小表之间的连接。且连接键无索引。

        特点:需要较大的内存,如表太大则需要进行分区,并暂时存储至磁盘的临时段。扫描成本 = 全表扫描大表 + 分区数 * 表全表扫描小表;还需要注意的是:必须将 HASH_JOIN_ENABLED 设为 True, 并且为参数 PGA_AGGREGATE_TARGET 设置了一个足够大的值后,才可以执行 Hash Join 。

        使用: USE_HASH(t1 t2) 提示来强制执行 Hash Join

     

    3、 排序合并连接( Sort Merge Join )

        原理:将两个表分别进行排序,然后将两个表合并,查找出匹配的记录。

        条件:行源已经被排过序的情况下使用。

        特点:主要花费在两个表的全表扫描和各自的排序上。

        使用: USE_MERGE(t1 t2) 提示来强制执行 Sort Merge Join 。

     

     

        总结 :当缺少有用的索引时,哈希连接比嵌套循环连接更加有效。哈希连接可能比排序合并连接更快,因为在这种情况下只有一张源表需要排序。哈希连接也可能比嵌套循环连接更快,因为处理内存中的哈希表比检索 B_Tree 索引更加迅速。

    二、Oracle外部连接方式也分3类:

        SQL> select * from t11;

                C1         C2
        ---------- ----------
                 5          5
                 1          1
                 2          2

        SQL> select * from t22;

                D1         D2
        ---------- ----------
                 1          1
                 2          2
                 3          3
                 4          4

     

    1、内连接(inner join)

        SQL> select c1,c2,d1,d2 from t11 inner join t22 on t11.c1=t22.d1;

        等效于:(可简写为join)

        SQL> select c1,c2,d1,d2 from t11,t22 where t11.c1=t22.d1;

        效果:

                C1         C2         D1         D2
        ---------- ---------- ---------- ----------
                 1          1          1          1
                 2          2          2          2

     

    2、外连接(outer join)

     

      ①左外连接

        SQL> select c1,c2,d1,d2 from t11 left outer join t22 on t11.c1=t22.d1;

        等效于:(可简写为left join)

        SQL> select c1,c2,d1,d2 from t11,t22 where t11.c1=t22.d1(+);

        效果:

                C1         C2         D1         D2
        ---------- ---------- ---------- ----------
                 5          5
                 1          1          1          1
                 2          2          2          2

      ②右外连接

        SQL> select c1,c2,d1,d2 from t11 right outer join t22 on t11.c1=t22.d1;

        等效于:(可简写为right join)

        SQL> select c1,c2,d1,d2 from t11,t22 where t11.c1(+)=t22.d1;

        效果:

                C1         C2         D1         D2
        ---------- ---------- ---------- ----------
                 1          1          1          1
                 2          2          2          2
                                       4          4
                                       3          3

      ③全外连接

        SQL> select c1,c2,d1,d2 from t11 full outer join t22 on t11.c1=t22.d1;

        效果:

                C1         C2         D1         D2
        ---------- ---------- ---------- ----------
                 5          5
                 1          1          1          1
                 2          2          2          2
                                       4          4
                                       3          3

        等效于:(可简写为full join)

        SQL> select c1,c2,d1,d2 from t11,t22 where t11.c1=t22.d1(+)
          2  union
          3  select c1,c2,d1,d2 from t11,t22 where t11.c1(+)=t22.d1;

     

    3、交叉连接(cross join)

        SQL> select c1,c2,d1,d2 from t11 cross join t22;

        等效于:(其他join必须有on子句)

        SQL> select c1,c2,d1,d2 from t11,t22;

        效果:

                C1         C2         D1         D2
        ---------- ---------- ---------- ----------
                 5          5          1          1
                 5          5          2          2
                 5          5          3          3
                 5          5          4          4
                 1          1          1          1
                 1          1          2          2
                 1          1          3          3
                 1          1          4          4
                 2          2          1          1
                 2          2          2          2
                 2          2          3          3

                 2          2          4          4

        12 rows selected.

  • 相关阅读:
    centos 7 执行userdel命令提示user wuweib is currently used by process 10388
    Linux系统centOS 7执行netstat命令,提示bash:netstat:command not found......
    CentOS 7可以正常登录,但是root每次登录都有几行警告
    Linux初安装联网、图形界面的安装、开机图形界面与命令行界面模式默认修改
    Linux在虚拟机的安装步骤(CentOS 7.7.1908)
    Linux的CentOS 镜像下载步骤
    服务器认识
    Python+ddt模块做接口自动化login登录用例【接口自动化框架设计系列】【多测师】
    Python做接口自动化测试HTMLTestRunner模块源码分析【接口自动化框架设计系列】【多测师】
    Python接口自动化ddt模块的源代码分析【接口自动化框架设计系列】【多测师】
  • 原文地址:https://www.cnblogs.com/wbzhao/p/2424451.html
Copyright © 2011-2022 走看看