連接的三種模式

該實驗的目的是瞭解表的連接模式
連接(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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章