ITPub博客

首页 > 数据库 > Oracle > JOIN连接的3种模式

JOIN连接的3种模式

原创 Oracle 作者:lucyne 时间:2015-08-14 14:46:35 0 删除 编辑
连接(join)
如果有主键的列连接,将带主键和唯一键约束的表放在连接的第一个位置,再考虑其它表连接
如果有外键连接,则将该表放在连接的最后。


Nested Loop Joins(嵌套循环连接)
外部表的每一行都和内部表的所有行连接。
当表的行较少的时候,数据库会选择这种连接。
提示:USE_NL(table1 table2)
SQL> CONN SCOTT/TIGER
Connected.
SQL> set autot traceonly explain
SQL> select ename,loc from emp,dept
  2  where emp.deptno=dept.deptno ;


Execution Plan
----------------------------------------------------------
Plan hash value: 351108634


----------------------------------------------------------------------------------------
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |         |    14 |   280 |     5   (0)| 00:00:01 |
|   1 |  NESTED LOOPS                |         |    14 |   280 |     5   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL          | EMP     |    14 |   126 |     4   (0)| 00:00:01 |
|   3 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     1 |    11 |     1   (0)| 00:00:01 |
|*  4 |    INDEX UNIQUE SCAN         | PK_DEPT |     1 |       |     0   (0)| 00:00:01 |


Hash Joins
适用于大数据量的连接。
将两个表中较小的表的连接列建立一个hash表,将hash表放入到内存中。
什么时候用HASH连接?大量数据要连接,但要想使hash连接起到作用,必须有等值的条件.
使用hint:USE_HASH


SQL> drop table t1 purge;


Table dropped.


SQL> drop table t2 purge;


Table dropped.


SQL> create table t1 as select * from dept;


Table created.


SQL> create table t2 as select * from emp;


Table created.


SQL> select ename,loc from t1,t2
  2  where t1.deptno=t2.deptno;


Execution Plan
----------------------------------------------------------
Plan hash value: 1838229974


---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    14 |   574 |     9  (12)| 00:00:01 |
|*  1 |  HASH JOIN         |      |    14 |   574 |     9  (12)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| T1   |     4 |    84 |     4   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| T2   |    14 |   280 |     4   (0)| 00:00:01 |
---------------------------------------------------------------------------


排序融合连接
HASH连接在大部分时候都比排序连接性能好。
但如果不是等值条件的时候,条件是>,>=,<,<=的时候,不能使用hash连接,使用排序连接和嵌套循环连接。
再有当连接的结果要排好序的时候,也可以选择排序融合连接。
SQL> --1.NEST LOOP
SQL> SET AUTOT TRACE EXP
SQL> SELECT ENAME,LOC FROM EMP E,DEPT D
  2  WHERE E.DEPTNO=D.DEPTNO AND E.DEPTNO=10;


执行计划
----------------------------------------------------------                                          
Plan hash value: 568005898                                                                          
                                                                                                    
----------------------------------------------------------------------------------------            
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |            
----------------------------------------------------------------------------------------            
|   0 | SELECT STATEMENT             |         |     3 |    60 |     4   (0)| 00:00:01 |            
|   1 |  NESTED LOOPS                |         |     3 |    60 |     4   (0)| 00:00:01 |            
|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     1 |    11 |     1   (0)| 00:00:01 |            
|*  3 |    INDEX UNIQUE SCAN         | PK_DEPT |     1 |       |     0   (0)| 00:00:01 |            
|*  4 |   TABLE ACCESS FULL          | EMP     |     3 |    27 |     3   (0)| 00:00:01 |            
----------------------------------------------------------------------------------------            
                                                                                                    
Predicate Information (identified by operation id):                                                 
---------------------------------------------------                                                 
                                                                                                    
   3 - access("D"."DEPTNO"=10)                                                                      
   4 - filter("E"."DEPTNO"=10)                                                                      


SQL> --2.SORT MERGE
SQL> SELECT ENAME,GRADE FROM EMP,SALGRADE WHERE SAL BETWEEN LOSAL AND HISAL;


执行计划
----------------------------------------------------------                                          
Plan hash value: 270072162                                                                          
                                                                                                    
---------------------------------------------------------------------------------                   
| Id  | Operation            | Name     | Rows  | Bytes | Cost (%CPU)| Time     |                   
---------------------------------------------------------------------------------                   
|   0 | SELECT STATEMENT     |          |     1 |    20 |     8  (25)| 00:00:01 |                   
|   1 |  MERGE JOIN          |          |     1 |    20 |     8  (25)| 00:00:01 |                   
|   2 |   SORT JOIN          |          |     5 |    50 |     4  (25)| 00:00:01 |                   
|   3 |    TABLE ACCESS FULL | SALGRADE |     5 |    50 |     3   (0)| 00:00:01 |                   
|*  4 |   FILTER             |          |       |       |            |          |                   
|*  5 |    SORT JOIN         |          |    14 |   140 |     4  (25)| 00:00:01 |                   
|   6 |     TABLE ACCESS FULL| EMP      |    14 |   140 |     3   (0)| 00:00:01 |                   
---------------------------------------------------------------------------------                   
                                                                                                    
Predicate Information (identified by operation id):                                                 
---------------------------------------------------                                                 
                                                                                                    
   4 - filter("SAL"<="HISAL")                                                                       
   5 - access("SAL">="LOSAL")                                                                       
       filter("SAL">="LOSAL")                                                                       


SQL> --3.HASH JOIN
SQL> SELECT ENAME,LOC FROM EMP E,DEPT D
  2  WHERE E.DEPTNO=D.DEPTNO;


执行计划
----------------------------------------------------------                                          
Plan hash value: 351108634                                                                          
                                                                                                    
----------------------------------------------------------------------------------------            
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |            
----------------------------------------------------------------------------------------            
|   0 | SELECT STATEMENT             |         |    14 |   280 |     4   (0)| 00:00:01 |            
|   1 |  NESTED LOOPS                |         |    14 |   280 |     4   (0)| 00:00:01 |            
|   2 |   TABLE ACCESS FULL          | EMP     |    14 |   126 |     3   (0)| 00:00:01 |            
|   3 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     1 |    11 |     1   (0)| 00:00:01 |            
|*  4 |    INDEX UNIQUE SCAN         | PK_DEPT |     1 |       |     0   (0)| 00:00:01 |            
----------------------------------------------------------------------------------------            
                                                                                                    
Predicate Information (identified by operation id):                                                 
---------------------------------------------------                                                 
                                                                                                    
   4 - access("E"."DEPTNO"="D"."DEPTNO")                                                            


SQL> DROP TABLE T1 PURGE;


表已删除。


SQL> CREATE TABLE T1 AS SELECT * FROM EMP;


表已创建。


SQL> INSERT INTO T1 SELECT * FROM T1;


已创建14行。




执行计划
----------------------------------------------------------                                          
Plan hash value: 3617692013                                                                         
                                                                                                    
--------------------------------------------------------------------------                          
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |                          
--------------------------------------------------------------------------                          
|   0 | INSERT STATEMENT  |      |   327 | 28449 |     2   (0)| 00:00:01 |                          
|   1 |  TABLE ACCESS FULL| T1   |   327 | 28449 |     2   (0)| 00:00:01 |                          
--------------------------------------------------------------------------                          


SQL> /


已创建28行。




执行计划
----------------------------------------------------------                                          
Plan hash value: 3617692013                                                                         
                                                                                                    
--------------------------------------------------------------------------                          
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |                          
--------------------------------------------------------------------------                          
|   0 | INSERT STATEMENT  |      |   327 | 28449 |     2   (0)| 00:00:01 |                          
|   1 |  TABLE ACCESS FULL| T1   |   327 | 28449 |     2   (0)| 00:00:01 |                          
--------------------------------------------------------------------------                          


SQL> /


已创建56行。




执行计划
----------------------------------------------------------                                          
Plan hash value: 3617692013                                                                         
                                                                                                    
--------------------------------------------------------------------------                          
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |                          
--------------------------------------------------------------------------                          
|   0 | INSERT STATEMENT  |      |   327 | 28449 |     2   (0)| 00:00:01 |                          
|   1 |  TABLE ACCESS FULL| T1   |   327 | 28449 |     2   (0)| 00:00:01 |                          
--------------------------------------------------------------------------                          


SQL> /


已创建112行。




执行计划
----------------------------------------------------------                                          
Plan hash value: 3617692013                                                                         
                                                                                                    
--------------------------------------------------------------------------                          
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |                          
--------------------------------------------------------------------------                          
|   0 | INSERT STATEMENT  |      |   327 | 28449 |     2   (0)| 00:00:01 |                          
|   1 |  TABLE ACCESS FULL| T1   |   327 | 28449 |     2   (0)| 00:00:01 |                          
--------------------------------------------------------------------------                          


SQL> SELECT ENAME,LOC FROM T1 E,DEPT D
  2  WHERE E.DEPTNO=D.DEPTNO;


执行计划
----------------------------------------------------------                                          
Plan hash value: 1715696576                                                                         
                                                                                                    
----------------------------------------------------------------------------------------            
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |            
----------------------------------------------------------------------------------------            
|   0 | SELECT STATEMENT             |         |   327 | 10137 |     3   (0)| 00:00:01 |            
|   1 |  NESTED LOOPS                |         |   327 | 10137 |     3   (0)| 00:00:01 |            
|   2 |   TABLE ACCESS FULL          | T1      |   327 |  6540 |     2   (0)| 00:00:01 |            
|   3 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     1 |    11 |     1   (0)| 00:00:01 |            
|*  4 |    INDEX UNIQUE SCAN         | PK_DEPT |     1 |       |     0   (0)| 00:00:01 |            
----------------------------------------------------------------------------------------            
                                                                                                    
Predicate Information (identified by operation id):                                                 
---------------------------------------------------                                                 
                                                                                                    
   4 - access("E"."DEPTNO"="D"."DEPTNO")                                                            


SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT','T1');


PL/SQL 过程已成功完成。


SQL> SELECT ENAME,LOC FROM T1 E,DEPT D
  2  WHERE E.DEPTNO=D.DEPTNO;


执行计划
----------------------------------------------------------                                          
Plan hash value: 1715696576                                                                         
                                                                                                    
----------------------------------------------------------------------------------------            
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |            
----------------------------------------------------------------------------------------            
|   0 | SELECT STATEMENT             |         |   224 |  4480 |     4   (0)| 00:00:01 |            
|   1 |  NESTED LOOPS                |         |   224 |  4480 |     4   (0)| 00:00:01 |            
|   2 |   TABLE ACCESS FULL          | T1      |   224 |  2016 |     3   (0)| 00:00:01 |            
|   3 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     1 |    11 |     1   (0)| 00:00:01 |            
|*  4 |    INDEX UNIQUE SCAN         | PK_DEPT |     1 |       |     0   (0)| 00:00:01 |            
----------------------------------------------------------------------------------------            
                                                                                                    
Predicate Information (identified by operation id):                                                 
---------------------------------------------------                                                 
                                                                                                    
   4 - access("E"."DEPTNO"="D"."DEPTNO")                                                            


SQL> INSERT INTO T1 SELECT * FROM T1;


已创建224行。




执行计划
----------------------------------------------------------                                          
Plan hash value: 3617692013                                                                         
                                                                                                    
--------------------------------------------------------------------------                          
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |                          
--------------------------------------------------------------------------                          
|   0 | INSERT STATEMENT  |      |   224 |  8512 |     3   (0)| 00:00:01 |                          
|   1 |  TABLE ACCESS FULL| T1   |   224 |  8512 |     3   (0)| 00:00:01 |                          
--------------------------------------------------------------------------                          


SQL> /


已创建448行。




执行计划
----------------------------------------------------------                                          
Plan hash value: 3617692013                                                                         
                                                                                                    
--------------------------------------------------------------------------                          
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |                          
--------------------------------------------------------------------------                          
|   0 | INSERT STATEMENT  |      |   224 |  8512 |     3   (0)| 00:00:01 |                          
|   1 |  TABLE ACCESS FULL| T1   |   224 |  8512 |     3   (0)| 00:00:01 |                          
--------------------------------------------------------------------------                          


SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT','T1');


PL/SQL 过程已成功完成。


SQL> SELECT ENAME,LOC FROM T1 E,DEPT D
  2  WHERE E.DEPTNO=D.DEPTNO;


执行计划
----------------------------------------------------------                                          
Plan hash value: 1715696576                                                                         
                                                                                                    
----------------------------------------------------------------------------------------            
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |            
----------------------------------------------------------------------------------------            
|   0 | SELECT STATEMENT             |         |   896 | 17920 |     6  (17)| 00:00:01 |            
|   1 |  NESTED LOOPS                |         |   896 | 17920 |     6  (17)| 00:00:01 |            
|   2 |   TABLE ACCESS FULL          | T1      |   896 |  8064 |     4   (0)| 00:00:01 |            
|   3 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     1 |    11 |     1   (0)| 00:00:01 |            
|*  4 |    INDEX UNIQUE SCAN         | PK_DEPT |     1 |       |     0   (0)| 00:00:01 |            
----------------------------------------------------------------------------------------            
                                                                                                    
Predicate Information (identified by operation id):                                                 
---------------------------------------------------                                                 
                                                                                                    
   4 - access("E"."DEPTNO"="D"."DEPTNO")                                                            


SQL> INSERT INTO T1 SELECT * FROM T1;


已创建896行。




执行计划
----------------------------------------------------------                                          
Plan hash value: 3617692013                                                                         
                                                                                                    
--------------------------------------------------------------------------                          
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |                          
--------------------------------------------------------------------------                          
|   0 | INSERT STATEMENT  |      |   896 | 34048 |     4   (0)| 00:00:01 |                          
|   1 |  TABLE ACCESS FULL| T1   |   896 | 34048 |     4   (0)| 00:00:01 |                          
--------------------------------------------------------------------------                          


SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT','T1');


PL/SQL 过程已成功完成。


SQL> SELECT ENAME,LOC FROM T1 E,DEPT D
  2  WHERE E.DEPTNO=D.DEPTNO;


执行计划
----------------------------------------------------------                                          
Plan hash value: 1290571005                                                                         
                                                                                                    
----------------------------------------------------------------------------------------            
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |            
----------------------------------------------------------------------------------------            
|   0 | SELECT STATEMENT             |         |  1792 | 35840 |     7  (15)| 00:00:01 |            
|   1 |  MERGE JOIN                  |         |  1792 | 35840 |     7  (15)| 00:00:01 |            
|   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     4 |    44 |     2   (0)| 00:00:01 |            
|   3 |    INDEX FULL SCAN           | PK_DEPT |     4 |       |     1   (0)| 00:00:01 |            
|*  4 |   SORT JOIN                  |         |  1792 | 16128 |     5  (20)| 00:00:01 |            
|   5 |    TABLE ACCESS FULL         | T1      |  1792 | 16128 |     4   (0)| 00:00:01 |            
----------------------------------------------------------------------------------------            
                                                                                                    
Predicate Information (identified by operation id):                                                 
---------------------------------------------------                                                 
                                                                                                    
   4 - access("E"."DEPTNO"="D"."DEPTNO")                                                            
       filter("E"."DEPTNO"="D"."DEPTNO")                                                            


SQL> INSERT INTO T1 SELECT * FROM T1;


已创建1792行。




执行计划
----------------------------------------------------------                                          
Plan hash value: 3617692013                                                                         
                                                                                                    
--------------------------------------------------------------------------                          
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |                          
--------------------------------------------------------------------------                          
|   0 | INSERT STATEMENT  |      |  1792 | 68096 |     4   (0)| 00:00:01 |                          
|   1 |  TABLE ACCESS FULL| T1   |  1792 | 68096 |     4   (0)| 00:00:01 |                          
--------------------------------------------------------------------------                          


SQL> INSERT INTO T1 SELECT * FROM T1;


已创建3584行。




执行计划
----------------------------------------------------------                                          
Plan hash value: 3617692013                                                                         
                                                                                                    
--------------------------------------------------------------------------                          
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |                          
--------------------------------------------------------------------------                          
|   0 | INSERT STATEMENT  |      |  1792 | 68096 |     4   (0)| 00:00:01 |                          
|   1 |  TABLE ACCESS FULL| T1   |  1792 | 68096 |     4   (0)| 00:00:01 |                          
--------------------------------------------------------------------------                          


SQL> INSERT INTO T1 SELECT * FROM T1;


已创建7168行。




执行计划
----------------------------------------------------------                                          
Plan hash value: 3617692013                                                                         
                                                                                                    
--------------------------------------------------------------------------                          
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |                          
--------------------------------------------------------------------------                          
|   0 | INSERT STATEMENT  |      |  1792 | 68096 |     4   (0)| 00:00:01 |                          
|   1 |  TABLE ACCESS FULL| T1   |  1792 | 68096 |     4   (0)| 00:00:01 |                          
--------------------------------------------------------------------------                          


SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT','T1');


PL/SQL 过程已成功完成。


SQL> SELECT ENAME,LOC FROM T1 E,DEPT D
  2  WHERE E.DEPTNO=D.DEPTNO;


执行计划
----------------------------------------------------------                                          
Plan hash value: 3343471717                                                                         
                                                                                                    
---------------------------------------------------------------------------                         
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |                         
---------------------------------------------------------------------------                         
|   0 | SELECT STATEMENT   |      | 14336 |   280K|    22  (10)| 00:00:01 |                         
|*  1 |  HASH JOIN         |      | 14336 |   280K|    22  (10)| 00:00:01 |                         
|   2 |   TABLE ACCESS FULL| DEPT |     4 |    44 |     3   (0)| 00:00:01 |                         
|   3 |   TABLE ACCESS FULL| T1   | 14336 |   126K|    18   (6)| 00:00:01 |                         
---------------------------------------------------------------------------                         
                                                                                                    
Predicate Information (identified by operation id):                                                 
---------------------------------------------------                                                 
                                                                                                    
   1 - access("E"."DEPTNO"="D"."DEPTNO")                                                            


SQL> SELECT ENAME,LOC FROM T1 E,DEPT D
  2  WHERE E.DEPTNO=D.DEPTNO ORDER BY E.DEPTNO;


执行计划
----------------------------------------------------------
Plan hash value: 108929063


------------------------------------------------------------------------------------
| Id  | Operation           | Name | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |      | 14336 |   280K|       |    83   (7)| 00:00:01 |
|   1 |  MERGE JOIN         |      | 14336 |   280K|       |    83   (7)| 00:00:01 |
|   2 |   SORT JOIN         |      |     4 |    44 |       |     4  (25)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| DEPT |     4 |    44 |       |     3   (0)| 00:00:01 |
|*  4 |   SORT JOIN         |      | 14336 |   126K|   584K|    79   (6)| 00:00:01 |
|   5 |    TABLE ACCESS FULL| T1   | 14336 |   126K|       |    18   (6)| 00:00:01 |
------------------------------------------------------------------------------------


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


   4 - access("E"."DEPTNO"="D"."DEPTNO")
       filter("E"."DEPTNO"="D"."DEPTNO")
SQL> SPOOL OFF

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26390465/viewspace-1771522/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
. . 一个 DBA. . .

注册时间:2012-01-06

  • 博文量
    84
  • 访问量
    783162