微課sql最佳化(14)、表的連線方法(3)-關於Nested Loops Join(巢狀迴圈)
1、NL的解釋
Nested Loops Join(巢狀迴圈),是指兩個資料集被稱為驅動表(outer loop or driving row source)和被驅動表(inner loop),驅動表只執行一次,被驅動表執行的次數等於驅動表返回的行數。如下圖所示,
2、 NL特點
1、驅動表執行1次,被驅動表執行N次(N等於驅動表返回的行數)。注:驅動表返回多少行,被驅動表執行多少次。
2、在所有資料處理完之前,就可以返回結果集的第一條記錄。
3、可以有效利用索引來處理限制條件和連線條件。
4、支援所有型別的連線。
3、NL的解釋(2)
We fetch data from tables as we need it. Here -- for the nested loops join -- it was processed much like this:
for x in ( select * from t t1 )
loop
for y in ( select * from t t2 where t2.object_id = X.OBJECT_ID )
loop
-- output to client --
end loop
end loop
4、NL示例
--drop table ht.c_cons_nl;
--create table ht.c_cons_nl as select * from ht.c_cons;
--create table ht.a_amt_nl as select * from ht.a_amt;
--update ht.c_cons_nl set cons_name='nl_test' where rownum<100;
--commit;
請最佳化以下語句:
select /*+ use_nl(c,a) */c.cons_no,c.cons_name,c.org_name,a.AMT_YM,a.amt
from ht.c_cons_nl c,ht.a_amt_nl a
where c.cons_no=a.cons_no
and c.cons_name='nl_test';
set line 200
set heading off
alter session set statistics_level=all;
select /*+ use_nl(c,a) */c.cons_no,c.cons_name,c.org_name,a.AMT_YM,a.amt
from ht.c_cons_nl c,ht.a_amt_nl a
where c.cons_no=a.cons_no
and c.cons_name='nl_test';
select * from table(DBMS_XPLAN.DISPLAY_CURSOR(null,null,'allstats last'));
Plan hash value: 942926597
------------------------------------------------------------------------------------------
| Id | Operation
| Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT |
| 1 |
| 54 |00:00:00.05 | 2109 |
| 1 | NESTED LOOPS
|
| 1 | 56 | 54 |00:00:00.05 | 2109 |
|* 2 | TABLE ACCESS FULL| C_CONS_NL | 1 | 9 |
9 |00:00:00.01 | 62 |
|* 3 | TABLE ACCESS FULL| A_AMT_NL | 9 | 6 | 54 |00:00:00.05 | 2047 |
------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("C"."CONS_NAME"='nl_test')
3 - filter("C"."CONS_NO"="A"."CONS_NO")
create index ht.idx_c_cons_name on ht.c_cons_nl(cons_name);
create index ht.idx_a_amt_no on ht.a_amt_nl(cons_no);
Plan hash value: 2953888364
-------------------------------------------------------------------------------------------------------------------
| Id | Operation
| Name
| Starts | E-Rows | A-Rows | A-Time
| Buffers | Reads |
--------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
|
| 1 |
|
54 |00:00:00.01 | 80 |
1 |
| 1 | NESTED LOOPS
|
| 1 | 56 |
54 |00:00:00.01 | 80 |
1 |
| 2 | NESTED LOOPS
|
| 1 | 56 |
54 |00:00:00.01 | 26 |
1 |
| 3 | TABLE ACCESS BY INDEX ROWID| C_CONS_NL
| 1 |
9 |
9 |00:00:00.01 | 11 |
0 |
|* 4 | INDEX RANGE SCAN
| IDX_C_CONS_NAME | 1 |
9 |
9 |00:00:00.01 |
6 |
0 |
|* 5 | INDEX RANGE SCAN
| IDX_A_AMT_NO
| 9 |
6 |
54 |00:00:00.01 | 15 |
1 |
| 6 | TABLE ACCESS BY INDEX ROWID | A_AMT_NL
| 54 |
6 |
54 |00:00:00.01 | 54 |
0 |
--------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("C"."CONS_NAME"='nl_test')
5 - access("C"."CONS_NO"="A"."CONS_NO")
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31442014/viewspace-2678273/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 微課sql最佳化(15)、表的連線方法(4)-關於Hash Join(雜湊連線)SQL
- 微課sql最佳化(16)、表的連線方法(5)-關於Merge Join(排序合連線)SQL排序
- 【TUNE_ORACLE】列出返回行數較多的巢狀迴圈(NESTED LOOPS)SQL的SQL參考Oracle巢狀OOPSQL
- 微課sql最佳化(13)、表的連線方法(2)-基礎概念SQL
- MySQL Join原理分析(緩衝塊巢狀與索引巢狀迴圈)MySql巢狀索引
- 微課sql最佳化(12)、表的連線方法(1)-幫助網友最佳化報表SQLSQL
- 記錄一次 postgresql 最佳化案例( 巢狀迴圈改HASH JOIN )SQL巢狀
- 最佳化兩個簡單的巢狀迴圈巢狀
- 微課sql最佳化(10)、關於資料訪問方法SQL
- while + else 使用,while死迴圈與while的巢狀,for迴圈基本使用,range關鍵字,for的迴圈補充(break、continue、else) ,for迴圈的巢狀,基本資料型別及內建方法While巢狀資料型別
- python怎麼迴圈巢狀Python巢狀
- 【SQL】13 SQL 別名、SQL 連線(JOIN)、SQL INNER JOIN 關鍵字、SQL LEFT JOIN 關鍵字、SQL RIGHT JOIN 關鍵字、SQL FULL OUTER JSQL
- 多表連線的三種方式詳解 hash join、merge join、 nested loopOOP
- sql語句左連結left join--3張表關聯SQL
- 【TUNE_ORACLE】列出NL(NESTED LOOPS)被驅動表走了全表掃描的SQL參考OracleOOPSQL
- Python的if else 巢狀 和forin while 迴圈Python巢狀While
- [譯] D3.js 巢狀選擇集 (Nested Selection)JS巢狀
- sql 連線查詢例項(left join)三表連線查詢SQL
- python 利用 for ... else 跳出雙層巢狀迴圈Python巢狀
- 微課sql最佳化(5)、統計資訊收集(3)-關於預設取樣率SQL
- SQL語句中不同的連線JOIN及SQL中join的各種用法SQL
- Java | 靜態巢狀類(Static Nested Class)Java巢狀
- 微課sql最佳化(4)、幫助“表姐”最佳化報表SQL
- 關於 MySQL 的巢狀事務MySql巢狀
- 迴圈中巢狀非同步操作的流程控制巢狀非同步
- python基礎語法迴圈巢狀和列表(一)Python巢狀
- python基礎語法迴圈巢狀和列表(二)Python巢狀
- java中如何將巢狀迴圈效能提高500倍Java巢狀
- Mysql join 的本質,Nested Loop Join 和 Hash JoinMySqlOOP
- 微課sql最佳化(17)、不改程式碼,最佳化SQL(1)-最佳化方法總結SQL
- T-SQL——關於Join on的的連線條件和where的篩選條件的區分SQL
- 微課sql最佳化(7)、統計資訊收集(5)-關於直方圖SQL直方圖
- 使用C++和Qt框架編寫的示例程式碼,用於解釋上述關於進入新事件迴圈、巢狀事件迴圈與延遲刪除相關的內容C++QT框架事件巢狀
- 巢狀類遞迴巢狀遞迴
- mysql INNER JOIN、LEFT JOIN、RIGHT JOIN;內連線(等值連線)、左連線、右連線MySql
- Apache Spark SQL的高階Join連線技術ApacheSparkSQL
- 高效遍歷匹配Json資料,避免巢狀迴圈[轉]JSON巢狀
- 微課sql最佳化(6)、統計資訊收集(4)-關於動態取樣SQL