Oracle的表連線方法(二)巢狀迴圈連線
Oracle表連線方法有四種:
● 排序合併連線(Sort Merge Join)
● 巢狀迴圈連線(Nested Loops Join)
● 雜湊連線(Hash Join)
● 笛卡爾積(Cartesian Product)
巢狀迴圈連線是Oracle將連線的兩個表根據結果集的大小,決定出驅動表和被驅動表。結果集小的作為驅動表,結果集大的作為被驅動表。對於驅動表的每一行,都要與被驅動表的所有行使用連線條件進行匹配。適用於驅動表結果集很小,被驅動表在連線列上有高效索引的表連線。可以用於所有連線條件。對應的執行計劃為NESTED LOOPS。
SQL> select e.employee_id,e.last_name,d.department_name from employees e,departments d where e.department_id=d.department_id and d.department_id=80;
34 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1492013603
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 34 | 1054 | 4 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 34 | 1054 | 4 (0)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| DEPARTMENTS | 1 | 16 | 1 (0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN | DEPT_ID_PK | 1 | | 0 (0)| 00:00:01 |
|* 4 | TABLE ACCESS FULL | EMPLOYEES | 34 | 510 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------
這裡DEPARTMENTS表加了條件過濾後結果集只有1行,所以被選為驅動表。
SQL> select e.first_name,e.last_name,e.salary,d.department_name from employees e,departments d where d.department_name IN ('Marketing', 'Sales') and e.department_id = d.department_id;
36 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1021246405
--------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 19 | 722 | 4 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 19 | 722 | 4 (0)| 00:00:01 |
| 2 | NESTED LOOPS | | 20 | 722 | 4 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL | DEPARTMENTS | 2 | 32 | 3 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | EMP_DEPARTMENT_IX | 10 | | 0 (0)| 00:00:01 |
| 5 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 10 | 220 | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------
這裡有2次NESTED LOOPS,是因為Oracle 11g引入了引入了向量I/O(Vector I/O),批次處理多個物理I/O請求來提高巢狀迴圈連線的效率。
如果驅動表的限制條件的欄位上有索引,被驅動表的連線條件的欄位上有索引,則使用巢狀迴圈連線的效率就會很高。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28536251/viewspace-2140231/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 兩表連線一:巢狀迴圈連線巢狀
- 微課sql最佳化(14)、表的連線方法(3)-關於Nested Loops Join(巢狀迴圈)SQLOOP巢狀
- Oracle的表連線方法(三)雜湊連線Oracle
- Oracle的表連線方法(一)排序合併連線Oracle排序
- Oracle的表連線方法(七)Oracle
- Oracle的表連線方法(五)Oracle
- Oracle的表連線方法(六)Oracle
- 表連線方法
- Oracle 表連線Oracle
- linux下建立迴圈連線Linux
- 迴圈_巢狀巢狀
- Oracle 表連線方式詳解(外連結、內連線、自連線)Oracle
- python 跳出巢狀迴圈方法Python巢狀
- ORACLE 表連線方式Oracle
- oracle表連線方式Oracle
- Oracle的表連線方法(四)笛卡爾積Oracle
- Oracle字串連線的方法Oracle字串
- 【SQL】表連線 --半連線SQL
- Oracle表連線操作——Hash Join(雜湊連線)下Oracle
- Oracle表連線操作——Hash Join(雜湊連線)上Oracle
- ORACLE表連線方式及常見用法(二)Oracle
- c/c++ 線性表之單向迴圈連結串列C++
- c/c++ 線性表之雙向迴圈連結串列C++
- Oracle(+)連線與Join連線Oracle
- Oracle左連線,右連線Oracle
- Oracle的左連線和右連線Oracle
- Python 迴圈巢狀Python巢狀
- 巢狀迴圈成本消耗巢狀
- MySQL not in巢狀查詢改寫成外連線方式MySql巢狀
- 【SQL】Oracle的內連線、左外連線、右外連線及全外連線SQLOracle
- Oracle的三種表連線方式Oracle
- ORACLE 半連線與反連線Oracle
- Oracle 19c中連線RMAN客戶端的連線方法Oracle客戶端
- oracle 各種表間連線Oracle
- Oracle表連線操作——Merge Sort Join(合併排序連線)Oracle排序
- 兩表連線三:合併連線
- 資料結構與演算法(二) -- 線性表之單向迴圈連結串列資料結構演算法
- Oracle內連線、外連線、右外連線、全外連線小總結Oracle