三種表連線方式 最佳化總結
4個角度剖析經典連線 NL hashjoin MERGE sort JOIN
表的訪問次數 NL驅動表訪問多少次 兩表各自只訪問1次 與hashjoin一樣
被驅動表就訪問多少次 或0次
表的驅動順序與效能 與驅動表順序有關 類似NL,也與驅動順序有關 與驅動順序無關
表連線是否有排序 NL無排序 hash join無排序,(消耗記憶體) 有排序產生
各連線的使用限制 支援各種寫法 不支援><like<>等,限制最多 支援><但不支援like<>;
3中連線最佳化要點:
NL:1.請確保用在掃描的OLTP場景
2.驅動表的限制條件要考慮建立索引
3.被驅動表的連線條件要考慮建立索引
4.確保小結果集先驅動,大的被驅動
Hash Join
1.適用場景:請確保用在掃描的OLAP場景;明確該sql是否限制Hash join;兩表無任何索引傾向hash join;
2.被驅動表的連線條件要有索引,被驅動表的限制條件是用不上索引;
3.兩表的限制條件有索引(看返回量)
4.保證小結果集先驅動,大的再驅動
5.儘量保證pga能容納hash運算;
merge sort join
適用場景:請確保用在全掃描的OLAP場景,sql是否限制Merge sort join
1.兩表的限制條件有索引(看返回量);
2.連線條件索引消除排序(不完美);
3.避免取多餘列致排序的尺寸太大
4.pga能完成排序,避免磁碟排序;
1、巢狀迴圈連結(USE_NL)
主要消耗的相關資源:CPU,磁碟I/O
特點:在網上看到很多關於這方面的帖子,說小表作為驅動表,其實這種說話不完全正確,其實帶條件的大表返回較少行的結果集也可以作為驅動表(外部表)。此表連線在當有高選擇性索引或進行限制性搜尋時候效率較高,可以快速返回第一次的搜尋結果。
缺點:當索引丟失或查詢條件限制不夠時,效率很低。
最佳化要點:
2、排序合併連線(USE_MERGE)
主要消耗的相關資源:記憶體,臨時表空間
特點:在排序合併連線中,ORACLE分別將第一個源表、第二個源表按他們各自要連線的列排序,然後將兩個已經排序的源表合併。由於沒有索引,排序合併連線在合併兩表錢將強制對他們進行排序,兩表都需要進行全表掃描,所以表名在FROM自居中出現的次序並不重要。當缺乏索引或搜尋條件模糊時,該型別的連線比巢狀迴圈連線更加有效。
缺點:所有表都需要排序,它為最最佳化的吞吐量而設計,並且在結果沒有全部找到之前不返回資料。
3、雜湊連線(USE_HASH)
主要消耗的相關資源:記憶體,臨時表空間
特點:在雜湊連線中,ORACLE訪問第一張表(通常是連線結果中較小的表),並且在記憶體中建立一張基於連線鍵的雜湊表,然後他掃描另外一張表(較大的表),並根據雜湊表檢測是否有匹配的記錄。當缺乏索引或搜尋條件模糊時,該型別的連線比巢狀迴圈連線更加有效。通常比排序合併連線更快。
缺點:為建立雜湊表,需要大量的記憶體,第一次結果返回慢,如果在磁碟上操作,速度將更慢。
表的訪問次數 NL驅動表訪問多少次 兩表各自只訪問1次 與hashjoin一樣
被驅動表就訪問多少次 或0次
表的驅動順序與效能 與驅動表順序有關 類似NL,也與驅動順序有關 與驅動順序無關
表連線是否有排序 NL無排序 hash join無排序,(消耗記憶體) 有排序產生
各連線的使用限制 支援各種寫法 不支援><like<>等,限制最多 支援><但不支援like<>;
3中連線最佳化要點:
NL:1.請確保用在掃描的OLTP場景
2.驅動表的限制條件要考慮建立索引
3.被驅動表的連線條件要考慮建立索引
4.確保小結果集先驅動,大的被驅動
Hash Join
1.適用場景:請確保用在掃描的OLAP場景;明確該sql是否限制Hash join;兩表無任何索引傾向hash join;
2.被驅動表的連線條件要有索引,被驅動表的限制條件是用不上索引;
3.兩表的限制條件有索引(看返回量)
4.保證小結果集先驅動,大的再驅動
5.儘量保證pga能容納hash運算;
merge sort join
適用場景:請確保用在全掃描的OLAP場景,sql是否限制Merge sort join
1.兩表的限制條件有索引(看返回量);
2.連線條件索引消除排序(不完美);
3.避免取多餘列致排序的尺寸太大
4.pga能完成排序,避免磁碟排序;
1、巢狀迴圈連結(USE_NL)
主要消耗的相關資源:CPU,磁碟I/O
特點:在網上看到很多關於這方面的帖子,說小表作為驅動表,其實這種說話不完全正確,其實帶條件的大表返回較少行的結果集也可以作為驅動表(外部表)。此表連線在當有高選擇性索引或進行限制性搜尋時候效率較高,可以快速返回第一次的搜尋結果。
缺點:當索引丟失或查詢條件限制不夠時,效率很低。
最佳化要點:
2、排序合併連線(USE_MERGE)
主要消耗的相關資源:記憶體,臨時表空間
特點:在排序合併連線中,ORACLE分別將第一個源表、第二個源表按他們各自要連線的列排序,然後將兩個已經排序的源表合併。由於沒有索引,排序合併連線在合併兩表錢將強制對他們進行排序,兩表都需要進行全表掃描,所以表名在FROM自居中出現的次序並不重要。當缺乏索引或搜尋條件模糊時,該型別的連線比巢狀迴圈連線更加有效。
缺點:所有表都需要排序,它為最最佳化的吞吐量而設計,並且在結果沒有全部找到之前不返回資料。
3、雜湊連線(USE_HASH)
主要消耗的相關資源:記憶體,臨時表空間
特點:在雜湊連線中,ORACLE訪問第一張表(通常是連線結果中較小的表),並且在記憶體中建立一張基於連線鍵的雜湊表,然後他掃描另外一張表(較大的表),並根據雜湊表檢測是否有匹配的記錄。當缺乏索引或搜尋條件模糊時,該型別的連線比巢狀迴圈連線更加有效。通常比排序合併連線更快。
缺點:為建立雜湊表,需要大量的記憶體,第一次結果返回慢,如果在磁碟上操作,速度將更慢。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2117190/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【SQL 效能最佳化】表的三種連線方式SQL
- Oracle的三種表連線方式Oracle
- 【SQL 效能優化】表的三種連線方式SQL優化
- 【SQL】表連線七種方式SQL
- 幾種表的連線方式(SQL)SQL
- 表的三種連線方式官方解釋及個人理解
- merge into三種表連線方式的效能比較(一)
- 三種連結方式的區別
- 各種表連線方式對比分析
- 3種主要表連線方式對比
- vmware中三種網路連線方式
- Oracle 表連線方式詳解(外連結、內連線、自連線)Oracle
- React | ref三種使用方式總結React
- Linux網路連線的三種方式Linux
- ORACLE 表連線方式Oracle
- oracle表連線方式Oracle
- Python種匯入模組的三種方式總結Python
- SQL 三表連線SQL
- 內連線、外連線總結
- 兩表連線三:合併連線
- 使用者連線到oracle的三種驗證方式Oracle
- SQL表連線方式詳解SQL
- ORACLE會話連線程式三者總結Oracle會話線程
- 【程式設計】java jdbc/ojdbc 連結oracle的三種方式程式設計JavaJDBCOracle
- SQL中的四種連線方式SQL
- HTTP代理的兩種連線方式HTTP
- golang 幾種字串的連線方式Golang字串
- Sqlplus 多種連線方式SQL
- oracle 各種表間連線Oracle
- 表連線方式及使用場合
- Oracle 表連線方式分析(精讀)Oracle
- python連線clickhouse資料庫的兩種方式小結Python資料庫
- Oracle的表連線方法(三)雜湊連線Oracle
- hadoop MapReduce 三種連線Hadoop
- JDBC 連線oracle三種方法JDBCOracle
- oracle客戶端連線server 端, tnsnames的三種設定方式Oracle客戶端Server
- html樣式表三種引入方式HTML
- mysql 外連線總結MySql