微課sql最佳化(16)、表的連線方法(5)-關於Merge Join(排序合連線)
1、原理解釋
2、Merge Join特點
1、每個子節點只會執行一次
2、每個輸入資料集都必須按照連線條件的欄位進行排序
3、由於排序操作,在返回第一條結果前,兩個資料集都必須被完全讀出並排序。
3、 適用場景
Merge Join將兩個表排序,然後將兩個表合併。通常情況下,只有在以下情況發生時,才會使用此種JOIN方式:
1.RBO模式
2.不等價關聯(>,<,>=,<=,<>)
3.HASH_JOIN_ENABLED=false
4.資料來源已排序
4、Merge Join示例
SQL> select /*+ ordered use_merge(a)*/c.cons_no,c.cons_name,a.AMT_YM,a.amt
from ht.c_cons_hash c,ht.a_amt_hash a
where c.cons_no=a.cons_no
and c.cons_name='Hash_Join'
order by 1; 2 3 4 5
Execution Plan
----------------------------------------------------------
Plan hash value: 1313733800
--------------------------------------------------------------------------------------------------------------
| Id | Operation
| Name
| Rows | Bytes |TempSpc| Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
|
|
12 |
360 |
|
401 (1)| 00:00:05 |
| 1 | MERGE JOIN
|
|
12 |
360 |
|
401 (1)| 00:00:05 |
| 2 | SORT JOIN
|
|
2 |
26 |
|
4 (25)| 00:00:01 |
| 3 | TABLE ACCESS BY INDEX ROWID| C_CONS_HASH
|
2 |
26 |
|
3 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN
| IDX_C_CONS_HASH_NAME |
2 |
|
|
1 (0)| 00:00:01 |
|* 5 | SORT JOIN
|
| 59968 |
995K|
3320K|
397 (1)| 00:00:05 |
| 6 | TABLE ACCESS FULL
| A_AMT_HASH
| 59968 |
995K|
|
65 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("C"."CONS_NAME"='Hash_Join')
5 - access("C"."CONS_NO"="A"."CONS_NO")
filter("C"."CONS_NO"="A"."CONS_NO")
5、三種連線方式比較
NL: 從一張表中讀取資料,訪問另一張表(通常是索引)來做匹配,nested loops適用的場合是驅動錶行數較小時,效率會更高。
Hash join: 將一個表(通常是小一點的那個表)對連線鍵做hash運算,將Hash結果做為索引值和行資訊儲存到Hash表中,從另一個表中抽取記錄,對連線鍵做hash運算,到Hash表中查詢匹配的行。
Merge Join 是先將關聯表的關聯列各自做排序,然後從各自的排序表中抽取資料,到另一個排序表中做匹配,因為merge join需要做更多的排序,所以消耗的資源更多。 通常情況下,Hash Join會比
Merge Join效能更好。
6、引數文件
《Oracle? Database Performance Tuning Guide 11g Release 2 (11.2)》
《Troubleshooting Oracle Performance》
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31442014/viewspace-2678276/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 微課sql最佳化(15)、表的連線方法(4)-關於Hash Join(雜湊連線)SQL
- 微課sql最佳化(14)、表的連線方法(3)-關於Nested Loops Join(巢狀迴圈)SQLOOP巢狀
- 微課sql最佳化(13)、表的連線方法(2)-基礎概念SQL
- 微課sql最佳化(12)、表的連線方法(1)-幫助網友最佳化報表SQLSQL
- sql 連線查詢例項(left join)三表連線查詢SQL
- mysql INNER JOIN、LEFT JOIN、RIGHT JOIN;內連線(等值連線)、左連線、右連線MySql
- 多表連線的三種方式詳解 hash join、merge join、 nested loopOOP
- 【SQL】13 SQL 別名、SQL 連線(JOIN)、SQL INNER JOIN 關鍵字、SQL LEFT JOIN 關鍵字、SQL RIGHT JOIN 關鍵字、SQL FULL OUTER JSQL
- SQL語句中不同的連線JOIN及SQL中join的各種用法SQL
- Apache Spark SQL的高階Join連線技術ApacheSparkSQL
- LEFT JOIN 和JOIN 多表連線
- 【SQL】SQL表連線方法方式介紹(Oracle/Postgresql)SQLOracle
- 關於面向連線與面向無連線
- [資料庫][SQL]圖解各種連線join資料庫SQL圖解
- sql 內連線和外連線SQL
- T-SQL——關於Join on的的連線條件和where的篩選條件的區分SQL
- T-SQL——關於跨庫連線查詢SQL
- 微課sql最佳化(10)、關於資料訪問方法SQL
- 表的連線是指在一個SQL語句中通過表與表之間的關連SQL
- Mysql關於長連線短連線優劣比較MySql
- 1.3.3.1. 關於連線資料庫的SQL*Plus 工具描述資料庫SQL
- 【TUNE_ORACLE】列出走了錯誤的排序合併連線的SQL參考Oracle排序SQL
- SQL的連線型別SQL型別
- python 怎麼連線 sql server,不是連線 mysqlPythonServerMySql
- sql語句左連結left join--3張表關聯SQL
- 關於canonmx538無線連線的問題
- SQL連線查詢SQL
- SQL 改寫系列十:半連線轉內連線SQL
- 關於 Homestead 連線 MySQL 問題MySql
- 關於在執行java連線MongoDB時遇到的連線超時問題JavaMongoDB
- 印表機離線了怎麼連線 印表機離線的連線方法
- 微課sql最佳化(7)、統計資訊收集(5)-關於直方圖SQL直方圖
- [20200711]關於左右連線的問題.txt
- Golang SQL連線池梳理GolangSQL
- 內連線、左連線、右連線
- go~連線redis的方法GoRedis
- 表連線型別型別
- 關於外連線和where條件