首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 選擇性與執行計畫基礎:從列唯一值比率到樹狀/線性計畫解讀

     編輯:Oracle 資料庫基礎

什麼是選擇性?

選擇性 = 列唯一值數量 / 表總行數

  • 值趨近 1:高選擇性(如主鍵、唯一鍵),極適合建立索引,索引掃描回傳極少行。
  • 值趨近 0:低選擇性(如性別、狀態碼),全表掃描通常更優。

高選擇性列上的查詢回傳資料少,索引存取效率極高;低選擇性列強行用索引,反而因大量 TABLE ACCESS BY ROWID 隨機 I/O 拖垮效能。

執行計畫:SQL 執行的「施工藍圖」

Oracle 執行一條 SQL 可能經歷多個步驟,每步稱為行源。步驟組合即執行計畫,是 SQL 調優的核心觀測對象。

範例 SQL

SELECT ename, job, sal, dname
FROM emp, dept
WHERE emp.deptno = dept.deptno
  AND NOT EXISTS (
    SELECT * FROM salgrade
    WHERE emp.sal BETWEEN losal AND hisal
  );

查詢薪資不在任何建議區間內的員工資訊。

樹狀計畫結構與執行順序

執行計畫樹狀圖

  • 紅框(存取路徑):從資料檔物理讀取資料(Full Scan、Index Scan、Rowid Lookup)。
  • 黑框(行源操作):Join、Sort、Filter 等邏輯運算。

關鍵認知:編號 ≠ 執行順序

  • Oracle 先執行葉子節點(如步驟 3、5、6)。
  • 父節點在收到子節點傳回的行後立即處理(管道式),不等所有行。
  • 例:步驟 3 讀一行 → 步驟 5 查索引 → 步驟 4 取表行 → 步驟 2 Join → 步驟 1 Filter → 輸出。對步驟 3 每一行重複此流程。

兩類父節點行為

  1. 流水線型:單行即可啟動(Table Access、Index Scan、Nested Loops、Filter)。適合 FIRST_ROWS 目標,快速回應首筆資料。
  2. 阻塞型:需收集所有子行才能運算(Sort、Sort Merge Join、Group By、聚合)。適合 ALL_ROWS 目標,追求總吞吐。

並行執行提示

實際運行中,葉子步驟(如 3、5、4)可能並行執行。樹狀圖難以反映並行順序,需輔以線性計畫(DBMS_XPLAN.DISPLAY_CURSOR)觀察 PX 算子與 TQ 佇列。

結語

選擇性決定索引價值,執行計畫揭示執行真相。掌握樹狀結構的「葉子先行、管道流動、阻塞識別」三大原則,配合 FIRST_ROWS/ALL_ROWS 目標選擇,是讀懂計畫、精準調優的入門鑰匙。

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