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

Oracle 執行計劃核心概念深度解析:Rowid、遞歸 SQL、行源、謂詞、驅動表與訪問路徑全解

     編輯:Oracle 資料庫基礎

核心術語

術語定義
Rowid偽列,系統自動維護,行生命周期內唯一不變(行遷移時留指針),不可修改/刪除/插入。
Recursive SQL為執行用戶 SQL 而內部發遞歸調用(如 DDL 修改數據字典、觸發器、缺失統計信息時查字典)。
Row Source操作返回的符合條件行集合(全表、過濾後、Join 結果等)。
PredicateWHERE 子句中的限制條件。
Driving Table (Outer)嵌套循環/哈希連接中首先訪問、結果集較小的行源(關鍵看過濾後行數,非表大小)。
Probed Table (Inner)被探查的行源,通常較大,連接列需有索引。
Concatenated Index多列索引,首列為 Leading Column,查詢必須包含首列才能使用。
Selectivity唯一值數/總行數,越接近 1 越適合建索引、走索引掃描。

四大數據訪問路徑

1. Full Table Scan (FTS)

  • 多塊讀 (db_file_multiblock_read_count),高吞吐。
  • 適用:無索引、需讀 >5-10% 行、並行查詢。

2. Table Access by ROWID

  • 單塊讀,定位最快。
  • 常見於索引查找後的表訪問。

3. Index Scan(四類)

類型觸發條件示例
Unique Scan唯一索引 + 等值條件WHERE empno=10
Range Scan唯一索引+範圍操作符 / 非唯一索引 / 組合索引未用全列WHERE empno>7876
Full Scan查詢列全在索引中,需排序SELECT empno,ename FROM big_emp ORDER BY empno,ename (索引 BE_IX)
Fast Full Scan查詢列全在索引中,不需排序,多塊讀+並行SELECT empno,ename FROM big_emp

注意:若 SELECT 列表僅含索引列,可避免「表訪問 by ROWID」步驟,大幅減少 I/O。

三種連接算法

算法原理適用場景關鍵參數
Sort Merge Join (SMJ)雙側排序後歸併非等值連接、雙側已排序(索引)、大表連接無
Nested Loops (NL)外層驅動表逐行探查內表驅動表小、內表有高選擇性索引、需快速首行響應無
Hash Join (HJ)構建小表 Hash 表,探查大表等值連接、CBO、大表連接、hash_area_size 充足HASH_JOIN_ENABLED=TRUE, hash_area_size
  • NL 可先返回結果(流水線),適合 OLTP 首屏加載。
  • HJ 理論效率最高,但需足夠內存避免磁盤溢寫。
  • Cartesian Product:無連接條件,極度危險,僅星型查詢特定場景使用。

選擇指南

  • 小表驅動大表 + 索引 → NL
  • 大表連接大表、等值、內存足 → HJ
  • 非等值、或雙側已排序 → SMJ
  • 統計信息準確是優化器選對連接的前提。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved