在Oracle中,什麼是半鏈接(Semi Join)?程序員
半鏈接(Semi Join)是一種特殊的鏈接類型,當作子查詢展開時,Oracle常常會把那些外部WHERE條件爲EXISTS、IN或= ANY的子查詢轉換爲對應的半鏈接。半鏈接分爲嵌套循環半鏈接(Hint爲:NL_SJ)、排序合併半鏈接(Hint爲:MERGE_SJ)和哈希半鏈接(Hint爲:HASH_SJ),不過在新版本數據庫裏,都傾向於使用哈希半鏈接。不過哈希半鏈接也有一些限制條件,例如,只能使用等值鏈接、不能使用GROUP BY、CONNECT BY、ROWNUM等限制條件。在執行計劃中如有關鍵字「HASH JOIN SEMI」,則說明Oracle使用了哈希半鏈接。示例以下所示:面試
1SELECT * FROM scott.DEPT A WHERE DEPTNO IN (SELECT /*+ HASH_SJ */ DEPTNO FROM scott.EMP);
2---------------------------------------------------------------------------
3| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
4---------------------------------------------------------------------------
5| 0 | SELECT STATEMENT | | 3 | 69 | 7 (15)| 00:00:01 |
6|* 1 | HASH JOIN SEMI | | 3 | 69 | 7 (15)| 00:00:01 |
7| 2 | TABLE ACCESS FULL| DEPT | 4 | 80 | 3 (0)| 00:00:01 |
8| 3 | TABLE ACCESS FULL| EMP | 14 | 42 | 3 (0)| 00:00:01 |
9---------------------------------------------------------------------------
10SELECT * FROM scott.DEPT A WHERE DEPTNO IN (SELECT /*+ MERGE_SJ */ DEPTNO FROM scott.EMP);
11----------------------------------------------------------------------------------------
12| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
13----------------------------------------------------------------------------------------
14| 0 | SELECT STATEMENT | | 3 | 69 | 6 (17)| 00:00:01 |
15| 1 | MERGE JOIN SEMI | | 3 | 69 | 6 (17)| 00:00:01 |
16| 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 4 | 80 | 2 (0)| 00:00:01 |
17| 3 | INDEX FULL SCAN | PK_DEPT | 4 | | 1 (0)| 00:00:01 |
18|* 4 | SORT UNIQUE | | 14 | 42 | 4 (25)| 00:00:01 |
19| 5 | TABLE ACCESS FULL | EMP | 14 | 42 | 3 (0)| 00:00:01 |
20----------------------------------------------------------------------------------------
21SELECT * FROM scott.DEPT A WHERE DEPTNO IN (SELECT /*+ NL_SJ */ DEPTNO FROM scott.EMP);
22---------------------------------------------------------------------------
23| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
24---------------------------------------------------------------------------
25| 0 | SELECT STATEMENT | | 3 | 69 | 10 (0)| 00:00:01 |
26| 1 | NESTED LOOPS SEMI | | 3 | 69 | 10 (0)| 00:00:01 |
27| 2 | TABLE ACCESS FULL| DEPT | 4 | 80 | 3 (0)| 00:00:01 |
28|* 3 | TABLE ACCESS FULL| EMP | 9 | 27 | 2 (0)| 00:00:01 |
29---------------------------------------------------------------------------
本文選自《Oracle程序員面試筆試寶典》,做者:李華榮。
sql
詳細內容能夠添加麥老師微信或QQ私聊。數據庫
● 本文做者:小麥苗,只專一於數據庫的技術,更注重技術的運用微信
● 做者博客地址:http://blog.itpub.net/26736162/abstract/1/網絡
● 本系列題目來源於做者的學習筆記,部分整理自網絡,如有侵權或不當之處還請諒解app
● 版權全部,歡迎分享本文,轉載請保留出處ide
● QQ:646634621 QQ羣:618766405學習
● 提供OCP、OCM和高可用部分最實用的技能培訓spa
● 題目解答如有不當之處,還望各位朋友批評指正,共同進步
長按下圖識別二維碼或微信掃描下圖二維碼來關注小麥苗的微信公衆號:xiaomaimiaolhr,學習最實用的數據庫技術。
喜歡就點擊「好看」吧
本文分享自微信公衆號 - DB寶(lhrdba)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。