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

SQL 調優實戰(四):善用 Hints 干預執行計劃,掌握優化器行為

     編輯:Oracle 資料庫基礎

為何需要 Hints?

基於成本的優化器(CBO)在絕大多數情況下能選擇最優路徑,但偶爾會「聰明反被聰明誤」,產生極差執行計劃。此時 DBA 需人為干預,指定存取路徑、連接類型、連接順序、並行度等,使語句高效運行。

Hints 可控制的六大維度

  1. 優化器模式(RULE / CBO)
  2. CBO 目標:ALL_ROWS(吞吐量)或 FIRST_ROWS(響應速度)
  3. 表存取路徑:全表掃描、索引掃描、ROWID 直接存取
  4. 表連接類型:Nested Loops、Hash Join、Sort Merge Join
  5. 表連接順序
  6. 並行執行程度

語法規範

{DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]... */
-- 或
{DELETE|INSERT|SELECT|UPDATE} --+ hint [text] [hint[text]]...

關鍵規則:

  • Hints 僅作用於所在 SQL 區塊(以 SELECT/UPDATE/DELETE 開頭)
  • 註解必須緊跟關鍵字之後,/*+ 中 + 不可有空格
  • 多個 Hint 以空格分隔
  • 語法錯誤不會報錯,只會被忽略
  • 除 /*+ RULE */ 外,任何 Hint 皆會強制啟用 CBO;若無統計資訊,將使用預設值——建議定期收集統計資訊

全套 Hints 策略

單一 Hint(如 INDEX)可能因優化器選擇其他連接方法而失效。為確保計劃完全可控,需同時指定:索引、連接方法、連接順序等「全套 Hints」。

範例:完整控制多表連接

SELECT /*+ ORDERED 
           INDEX (b, jl_br_balances_n1) 
           USE_NL (j b) 
           USE_NL (glcc glf) 
           USE_MERGE (gp gsb) */
       b.application_id, b.set_of_books_id,
       b.personnel_id, p.vendor_id Personnel,
       p.segment1 PersonnelNumber, p.vendor_name Name
FROM   jl_br_journals j, ...
  • ORDERED:強制按 FROM 子句順序連接
  • INDEX:指定表 b 使用特定索引
  • USE_NL / USE_MERGE:指定連接算法

最佳實踐建議

  1. 優先收集完整統計資訊,讓 CBO 自主決策
  2. 僅在證實 CBO 失效且無法透過統計資訊調整時,才引入 Hints
  3. 採用全套 Hints 避免部分生效導致計劃不穩定
  4. 文檔化每個 Hint 的業務理由,便於升級後回歸測試
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved