Oracle 10g 引入多項針對電子表格、嵌套循環、基數估算的創新 Hint,本文系統解析 7 大核心 Hint 的適用場景、語法細節與實戰注意事項,助力 DBA 精準控制執行計劃。
功能:跳過詳細關係依賴圖分析等編譯期優化,保留過濾器創建、選擇性定位等核心優化。
適用場景:規則極多(數千+)的電子表格查詢,編譯時間達數小時。
SELECT /*+ SPREAD_MIN_ANALYSIS */ ... FROM ...
功能:完全禁用電子表格分析,同時忽略修訂規則與過濾器生成。
代價:可能產生次優執行計劃,僅用於編譯超時的緊急規避。
SELECT /*+ SPREAD_NO_ANALYSIS */ ... FROM ...
功能:強制 CBO 使用嵌套循環將指定表作為內表,且必須走索引。
前提條件:
SELECT /*+ USE_NL_WITH_INDEX(t1 t1_idx) */ ... FROM t1, t2 WHERE t1.id = t2.id
| Hint | 禁用連接類型 | 典型用例 |
|---|---|---|
| NO_USE_NL | 嵌套循環 | 大表關聯時避免 NL 災難性性能 |
| NO_USE_MERGE | 排序合併 | 非等值連接或數據已有序時 |
| NO_USE_HASH | 哈希連接 | 內存不足導致 TEMP 爆滿時 |
SELECT /*+ NO_USE_NL(employees) NO_USE_HASH(dept) */ ...
語法:`CARDINALITY([tablespec] card)`
作用:覆蓋 CBO 對表/查詢結果行數的估算,解決統計信息過期導致的計劃偏差。
SELECT /*+ CARDINALITY(orders 50000) */ * FROM orders WHERE status = 'NEW'
語法:`SELECTIVITY([tablespec] sel)`,`sel` 為 0-1 之間小數。
作用:直接干預謂詞過濾比例,配合 `CARDINALITY` 精準控制行數預估。
SELECT /*+ SELECTIVITY(customers 0.001) */ * FROM customers WHERE vip_level = 5
⚠ 衝突規則:同一組表同時指定 `CARDINALITY` 和 `SELECTIVITY` 時,兩者均被忽略。
語法:`NO_INDEX_FFS(tablespec indexspec)`
用途:防止 CBO 選擇 `INDEX FAST FULL SCAN` 而非預期的 `INDEX RANGE SCAN`。
更多 10g 優化器新特性請參考 Mike Ault 著《Oracle Database 10g New Features》第 7 章。