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

深入解析 Oracle 驅動表與 CBO 優化策略

     編輯:Oracle 資料庫基礎

在 Oracle 資料庫效能調校中,理解「驅動表」的選擇機制至關重要。成本基礎優化器(CBO)依賴統計資訊來決定最佳的連接順序與驅動表;若缺乏統計資訊,CBO 會預設採用 FROM 子句中從左到右的順序選擇驅動表,這與規則基礎優化器(RBO)的右到左順序截然不同。

驅動表選擇的核心邏輯

CBO 透過計算各種連接路徑的成本,挑選代價最低的執行計畫。當資料字典中存在完整統計資訊(經過 ANALYZE 或 DBMS_STATS 收集)時,優化器會自動根據 Cost 值決定連接類型(Nested Loops、Hash Join、Sort Merge Join)及驅動表,此時 WHERE 子句中條件的先後順序不再影響決策。若需人為干預,則必須使用 Hints。

實戰驗證:ORDERED Hint 的行為

透過建立三張測試表(A、B、C)及索引,執行多表連接查詢並觀察執行計畫,可驗證:若在 CBO 模式下加上 /*+ ORDERED */ 提示,Oracle 確實會依 FROM 子句順序(B → A → C)選擇驅動表。這證明了 Hint 能有效覆寫優化器的預設決策。

CREATE TABLE A (col1 NUMBER(4), col2 NUMBER(4), col4 CHAR(30));
CREATE TABLE B (col1 NUMBER(4), col3 NUMBER(4), name_b CHAR(30));
CREATE TABLE C (col2 NUMBER(4), col3 NUMBER(4), name_c CHAR(30));
CREATE INDEX inx_col12A ON A(col1, col2);

SELECT /*+ ORDERED */ A.col4
FROM B, A, C
WHERE B.col3 = 10
  AND A.col1 = B.col1
  AND A.col2 = C.col2
  AND C.col3 = 5;

關鍵結論

  • CBO 有統計資訊時,依 Cost 選擇驅動表與連接方式;無統計資訊時,依 FROM 子句左至右順序。
  • 使用 ORDERED Hint 可強制指定連接順序,但需謹慎使用,避免導致效能退化。
  • 定期收集統計資訊是讓 CBO 做出正確決策的前提。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved