首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

深入解析 Oracle 資料庫執行計劃:表連接的三大核心演算法

     編輯:Oracle 資料庫相關知識

前言:為何掌握 Join 機制至關重要

在 Oracle 資料庫效能調校的領域中,理解執行計劃如何連接表格是核心技能之一。當查詢涉及多張表時,Oracle 優化器必須決定採用哪種連接演算法、以何種順序存取表格,這些決策直接決定了查詢的回應時間與資源消耗。本文將系統性剖析三大經典連接類型——排序合併連接、巢狀迴圈連接、雜湊連接的內部運作原理、適用場景與效能考量。

核心概念:Row Source 與驅動表

在連接操作中,Oracle 以「Row Source」(列來源)來代表參與連接的資料集,而非單純的「表」。一個 Row Source 可以是實體表、視圖、子查詢結果,甚至是另一個連接操作的輸出。連接順序對效能影響極大:優化器會嘗試先套用限制條件(WHERE 子句)產生較小的 Row Source 作為「驅動表」(外部表),以減少後續連接的資料量。這就是為何「先過濾、後連接」是 SQL 撰寫的黃金法則。

連接條件分類:等值、非等值與外部連接

依連接條件中的運算子,可分為:

  • 等值連接:如 WHERE A.COL3 = B.COL4,最常見且最易優化。
  • 非等值連接:如 WHERE A.COL3 > B.COL4,無法使用雜湊連接,通常退回巢狀迴圈或排序合併。
  • 外部連接:如 WHERE A.COL3 = B.COL4(+),保留單邊所有資料,優化器處理較複雜。

本文以等值連接為例,闡述三大核心演算法。

演算法一:排序合併連接

運作流程

  1. 分別產生 Row Source 1 與 Row Source 2 所需資料。
  2. 對兩者依連接鍵(如 A.COL3、B.COL4)獨立排序。
  3. 對已排序的兩個資料流執行「合併」動作,類似合併排序法,線性掃描一次即可完成連接。

關鍵特性

  • 排序成本高:排序是極度消耗 CPU 與記憶體(PGA)的操作,尤其大表排序可能落盤(Temp 表空間),嚴重拖慢效能。
  • 預排序可免排序:若連接鍵上有索引(索引本身有序),或前序步驟已產生有序輸出,可跳過排序步驟,大幅提升速度。
  • 並行度限制:雖可並行讀取與並行排序,但最終合併階段為串行。

適用場景

  • 大量資料的等值連接,且雙方皆無合適索引。
  • 非等值連接(>、<、>=、<=)的唯一選擇。
  • 雙方 Row Source 已預先排序(如索引全掃描、前序 Sort 操作)。

演算法二:巢狀迴圈連接

運作流程

NL Join 如同雙層迴圈:

FOR each row IN Outer_Row_Source (驅動表) LOOP
    FOR each matching row IN Inner_Row_Source (被驅動表) LOOP
        輸出連接結果
    END LOOP;
END LOOP;

關鍵特性

  • 驅動表選擇至關重要:外層迴圈行數越少越好。理想情況是小表、或經過高選擇性過濾後的大表。
  • 內表存取路徑決定成敗:內表必須有高效存取路徑(通常是索引範圍掃描或唯一掃描)。若內表需全表掃描,NL Join 效能將急劇下降。
  • 實體 I/O 為核心指標:理論指導原則是「最小化總物理 I/O」,有時違反「小表驅動大表」反而更優,實測為準。

適用場景

  • 驅動表回傳極少行數(< 1% 或絕對行數極小)。
  • 內表連接鍵上有高選擇性索引。
  • OLTP 系統高頻、小結果集查詢。

演算法三:雜湊連接

運作流程

  1. 建構階段:掃描較小的 Row Source(Build Input),依連接鍵計算雜湊值,建立記憶體內雜湊表(Hash Table)。
  2. 探查階段:掃描較大的 Row Source(Probe Input),對每一行計算相同雜湊函數,直接定位到雜湊桶進行比對。

關鍵特性

  • 無需排序、無需索引:純記憶體雜湊運算,CPU 密集型,適合大量資料等值連接。
  • 記憶體壓力大:雜湊表必須放入 PGA,若超過 HASH_AREA_SIZE 或 PGA_AGGREGATE_TARGET 限制,將分區溢寫至 Temp 表空間,效能驟降。
  • 僅支援等值連接:非等值條件無法使用。
  • 並行擴展性極佳:可並行建構、並行探查,是資料倉庫、大報表查詢的首選。

適用場景

  • 大表與大表等值連接,且無合適索引。
  • 資料倉庫星狀查詢、事實表與維度表連接。
  • 並行查詢環境(PQO)。

實戰效能比較與選擇指南

維度Sort Merge JoinNested LoopsHash Join
連接類型等值 / 非等值等值僅等值
索引依賴可利用索引免排序內表必須有索引完全不需要索引
記憶體需求中(排序區)低高(雜湊表)
並行能力部分並行難並行完美並行
典型適用非等值、預排序資料小結果集、OLTP大表等值、DW/報表

優化器如何抉擇?

CBO(Cost-Based Optimizer)會根據統計資訊估算各連接方式的 Cost:

  • 驅動表基數估算(Rows)、連接鍵選擇性、索引可用性、記憶體參數、並行度設定。
  • 若統計資訊過期或缺失,CBO 可能誤判,導致選錯連接方式(如大表 NL Join 造成災難性效能)。

最佳實務:定期收集統計資訊(DBMS_STATS)、關鍵欄位建立直方圖、必要時使用 Hint(USE_NL、USE_HASH、USE_MERGE)強制指定,但以修正統計資訊為根本。

總結

掌握三大連接演算法的內核機制,能讓你從執行計劃一眼看穿效能瓶頸:

  • 看到 MERGE JOIN + SORT JOIN → 檢查是否可加索引免排序、或改 Hash Join。
  • 看到 NESTED LOOPS 且內表 FULL TABLE SCAN → 必須加索引或改寫 SQL。
  • 看到 HASH JOIN 溢寫 Temp → 增加 PGA、或調整 HASH_AREA_SIZE。

記住:沒有最好的連接方式,只有最適合當前資料分布與硬體資源的選擇。持續監控、分析執行計劃、維護精準統計資訊,才是穩定效能的不二法門。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved