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

Oracle 10g 優化器 Hint 進階:SPREAD_MIN_ANALYSIS 等新特性深度解析

     編輯:Oracle 資料庫基礎

Oracle 10g 全新優化器 Hint 技術白皮書

Oracle 10g 引入多項針對電子表格、嵌套循環、基數估算的創新 Hint,本文系統解析 7 大核心 Hint 的適用場景、語法細節與實戰注意事項,助力 DBA 精準控制執行計劃。

一、電子表格優化 Hint 族群

1. `SPREAD_MIN_ANALYSIS` — 縮減編譯時間

功能:跳過詳細關係依賴圖分析等編譯期優化,保留過濾器創建、選擇性定位等核心優化。

適用場景:規則極多(數千+)的電子表格查詢,編譯時間達數小時。

SELECT /*+ SPREAD_MIN_ANALYSIS */ ... FROM ...

2. `SPREAD_NO_ANALYSIS` — 極致編譯加速

功能:完全禁用電子表格分析,同時忽略修訂規則與過濾器生成。

代價:可能產生次優執行計劃,僅用於編譯超時的緊急規避。

SELECT /*+ SPREAD_NO_ANALYSIS */ ... FROM ...

二、連接優化 Hint 族群

3. `USE_NL_WITH_INDEX` — 指定嵌套循環+索引

功能:強制 CBO 使用嵌套循環將指定表作為內表,且必須走索引。

前提條件:

  • 若指定索引:該索引至少包含一個連接鍵列
  • 若未指定索引:CBO 能找到至少一個包含連接鍵的可用索引
SELECT /*+ USE_NL_WITH_INDEX(t1 t1_idx) */ ... FROM t1, t2 WHERE t1.id = t2.id

4. `NO_USE_NL` / `NO_USE_MERGE` / `NO_USE_HASH` — 禁用特定連接方式

Hint禁用連接類型典型用例
NO_USE_NL嵌套循環大表關聯時避免 NL 災難性性能
NO_USE_MERGE排序合併非等值連接或數據已有序時
NO_USE_HASH哈希連接內存不足導致 TEMP 爆滿時
SELECT /*+ NO_USE_NL(employees) NO_USE_HASH(dept) */ ...

三、統計資訊干預 Hint

5. `CARDINALITY` — 手動指定基數估算

語法:`CARDINALITY([tablespec] card)`

作用:覆蓋 CBO 對表/查詢結果行數的估算,解決統計信息過期導致的計劃偏差。

SELECT /*+ CARDINALITY(orders 50000) */ * FROM orders WHERE status = 'NEW'

6. `SELECTIVITY` — 手動指定選擇率

語法:`SELECTIVITY([tablespec] sel)`,`sel` 為 0-1 之間小數。

作用:直接干預謂詞過濾比例,配合 `CARDINALITY` 精準控制行數預估。

SELECT /*+ SELECTIVITY(customers 0.001) */ * FROM customers WHERE vip_level = 5

⚠ 衝突規則:同一組表同時指定 `CARDINALITY` 和 `SELECTIVITY` 時,兩者均被忽略。

7. `NO_INDEX_FFS` — 禁用索引快速全掃描

語法:`NO_INDEX_FFS(tablespec indexspec)`

用途:防止 CBO 選擇 `INDEX FAST FULL SCAN` 而非預期的 `INDEX RANGE SCAN`。

四、實戰最佳實踐

  1. 最小化干預:優先通過 `DBMS_STATS` 修正統計信息,Hint 作為最後手段
  2. 版本註釋:SQL 註釋中標註添加 Hint 的原因、日期、負責人
  3. 回歸測試:升級補丁集後必須驗證 Hint 仍生效且未產生負面影響
  4. 組合使用:`LEADING` + `USE_NL` + `INDEX` 組合比單一 Hint 更穩健

五、延伸閱讀

更多 10g 優化器新特性請參考 Mike Ault 著《Oracle Database 10g New Features》第 7 章。

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