该实验的目的是了解表的连接模式
连接(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> select ename,grade from emp,salgrade
2 where sal between LOSAL and hisal;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=7 Card=4 Bytes=64)
1 0 MERGE JOIN (Cost=7 Card=4 Bytes=64)
2 1 SORT (JOIN) (Cost=4 Card=5 Bytes=40)
3 2 TABLE ACCESS (FULL) OF 'SALGRADE' (Cost=2 Card=5 Bytes=40)
4 1 FILTER
5 4 SORT (JOIN)
6 5 TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=14 Bytes=112)