Oracle join類型及其性能對(duì)比分析
在 Oracle 中,連接查詢(JOIN) 的連接類型及其性能對(duì)比
一、Oracle中的連接方式分類與語(yǔ)法
1. 內(nèi)連接(INNER JOIN)
返回兩個(gè)表中滿足連接條件的記錄。
SELECT * FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id;
特點(diǎn):
- 只返回匹配的行。
- 是最常用的連接。
- 如果不指定連接方式(如使用
,和WHERE),默認(rèn)是內(nèi)連接。
2. 外連接(OUTER JOIN)
a)左外連接(LEFT OUTER JOIN)
返回左表的全部記錄,如果右表中沒有匹配的記錄,則右表列為 NULL。
SELECT * FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id;
b)右外連接(RIGHT OUTER JOIN)
返回右表的全部記錄,左表沒有匹配記錄的列為 NULL。
SELECT * FROM table1 t1 RIGHT JOIN table2 t2 ON t1.id = t2.id;
c)全外連接(FULL OUTER JOIN)
返回兩個(gè)表中的全部記錄,沒有匹配的部分列為 NULL。
SELECT * FROM table1 t1 FULL OUTER JOIN table2 t2 ON t1.id = t2.id;
3. 自連接(SELF JOIN)
同一個(gè)表連接自身。
SELECT a.name, b.name FROM employee a JOIN employee b ON a.manager_id = b.id;
4. 交叉連接(CROSS JOIN)
返回兩個(gè)表的笛卡爾積(每個(gè)表1條記錄,兩表組合1×1條記錄)。
SELECT * FROM table1 CROSS JOIN table2;
5. Oracle 專有語(yǔ)法:舊式連接(+)
SELECT * FROM table1 t1, table2 t2 WHERE t1.id = t2.id(+); -- 等價(jià)于 LEFT JOIN
二、連接查詢的性能效率比較
| 連接類型 | 行數(shù)大小關(guān)系 | 匹配情況 | 性能 | 優(yōu)化建議 |
|---|---|---|---|---|
| INNER JOIN | 常見,性能最好 | 有匹配 | 高效 | 使用索引字段連接 |
| LEFT JOIN | 左大右小 | 不一定匹配 | 中等 | 盡量加過濾條件 |
| RIGHT JOIN | 左小右大 | 不一定匹配 | 中等 | 同上,盡量避免 |
| FULL OUTER JOIN | 大數(shù)據(jù)慎用 | 不一定匹配 | 低效 | 避免在大數(shù)據(jù)量上使用 |
| CROSS JOIN | 小表可用,謹(jǐn)慎使用 | 無條件連接 | 最低 | 通常不推薦 |
| SELF JOIN | 中等 | 有匹配 | 中等 | 注意表別名 |
三、連接效率影響因素詳解
1. 連接字段是否建索引
- 有索引:優(yōu)化器可快速查找匹配項(xiàng)(Nested Loop)。
- 無索引:可能全表掃描(Hash Join、Merge Join)。
2. 表大小(數(shù)據(jù)量)
- 小表連接快,大表連接要謹(jǐn)慎。
- Oracle 優(yōu)化器會(huì)根據(jù)統(tǒng)計(jì)信息選擇合適連接方式。
3. 連接方式選擇
INNER JOIN優(yōu)于OUTER JOINOUTER JOIN多用于有缺失數(shù)據(jù)容忍時(shí)
4. Oracle 執(zhí)行計(jì)劃(EXPLAIN PLAN)
建議使用如下命令查看連接執(zhí)行方式:
EXPLAIN PLAN FOR SELECT ... FROM ... WHERE ...; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
四、連接算法(Oracle執(zhí)行時(shí)選擇)
| 算法 | 特點(diǎn) | 適用情況 |
|---|---|---|
| Nested Loop Join | 一條一條查找 | 小表驅(qū)動(dòng)大表,有索引時(shí)最佳 |
| Hash Join | 建立哈希表進(jìn)行匹配 | 大表連接,大量數(shù)據(jù)無索引時(shí) |
| Merge Join | 對(duì)兩個(gè)表排序再合并 | 連接列已排序或排序開銷可接受 |
五、性能優(yōu)化建議
- 優(yōu)先使用 INNER JOIN,避免 FULL OUTER JOIN。
- 連接字段建立索引(特別是被驅(qū)動(dòng)表的連接鍵)。
- 使用 WHERE 限定連接數(shù)據(jù)范圍。
- 避免連接過多大表(建議 ≤ 4 張表)。
- 開啟并更新表的統(tǒng)計(jì)信息,使 Oracle 優(yōu)化器選擇最佳執(zhí)行計(jì)劃。
- 避免在連接字段上使用函數(shù)或類型轉(zhuǎn)換,否則索引失效。
- 使用臨時(shí)表(WITH 或 MATERIALIZED VIEW)分步處理復(fù)雜連接邏輯
六、高效連接案例
多表連接,帶索引、過濾條件
SELECT o.order_id, c.customer_name, p.product_name FROM orders o JOIN customers c ON o.customer_id = c.customer_id JOIN products p ON o.product_id = p.product_id WHERE o.order_date >= SYSDATE - 30;
- 三表 INNER JOIN
- 所有連接字段建立索引
- 限定最近 30 天數(shù)據(jù),減少掃描量
七、總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Oracle中的定時(shí)任務(wù)實(shí)例教程
定時(shí)任務(wù)相信大家都不陌生,下面這篇文章主要給大家介紹了關(guān)于Oracle中定時(shí)任務(wù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-04-04
Oracle8i和Microsoft SQL Server比較
Oracle8i和Microsoft SQL Server比較...2007-03-03
Oracle通過遞歸查詢父子兄弟節(jié)點(diǎn)方法示例
這篇文章主要給大家介紹了關(guān)于Oracle如何通過遞歸查詢父子兄弟節(jié)點(diǎn)的相關(guān)資料,遞歸查詢對(duì)各位程序員來說應(yīng)該都不陌生,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
oracle數(shù)據(jù)庫(kù)中如何處理clob字段方法介紹
在知識(shí)庫(kù)的建立的時(shí)候,用普通VARCHAR2存放文章是顯然不夠的,本文將詳細(xì)將介紹oracle數(shù)據(jù)庫(kù)中如何處理clob字段方法,需要的朋友可以參考下2012-11-11
Oracle如何批量將表中字段名全轉(zhuǎn)換為大寫(利用簡(jiǎn)單存儲(chǔ)過程)
這篇文章主要給大家介紹了關(guān)于Oracle如何批量將表中字段名全轉(zhuǎn)換為大寫的相關(guān)資料,主要利用的就是一個(gè)簡(jiǎn)單的存儲(chǔ)過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
oracle數(shù)據(jù)庫(kù)中查看系統(tǒng)存儲(chǔ)過程的方法
這篇文章主要介紹了oracle數(shù)據(jù)庫(kù)中查看系統(tǒng)存儲(chǔ)過程的方法,需要的朋友可以參考下2014-06-06
Windows系統(tǒng)安裝Oracle 11g 數(shù)據(jù)庫(kù)圖文教程
這篇文章主要介紹了Windows系統(tǒng)安裝Oracle 11g 數(shù)據(jù)庫(kù)圖文教程,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10
ORACLE檢查找出損壞索引(Corrupt Indexes)的方法詳解
這篇文章主要給大家介紹了關(guān)于ORACLE如何檢查找出損壞索引(Corrupt Indexes)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09

