首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL 語句優化 Hint 大全:30 個 Oracle/MySQL 優化器指令實戰解析

     編輯:MySQL 資料庫相關知識

SQL 優化 Hint 完整指南:30 個核心指令詳解

Hint(提示)讓開發者能影響優化器決策。本文整理 30 個常用 Hint,涵蓋優化目標、訪問路徑、連接策略、並行、緩存等維度,附語法與適用場景。註:部分 Hint 為 Oracle 專用,MySQL 8.0+ 始支援有限 Hint(如 MAX_EXECUTION_TIME、BKA、NO_BKA、QB_NAME)。

一、優化目標類

Hint目標適用場景
/*+ ALL_ROWS */最佳吞吐量(成本基礎)批量處理、報表查詢
/*+ FIRST_ROWS(n) */最佳響應時間(前 n 行)分頁、交互式查詢
/*+ CHOOSE */有統計信息用 CBO,否則 RBO過渡期兼容
/*+ RULE */強制規則基礎優化 (RBO)舊系統、統計信息缺失

二、表訪問路徑類

Hint語法含義範例
FULL/*+ FULL(alias) */全表掃描/*+ FULL(a) */ SELECT * FROM emp a
ROWID/*+ ROWID(alias) */ROWID 訪問/*+ ROWID(emp) */ SELECT * FROM emp WHERE rowid > '...'
CLUSTER/*+ CLUSTER(alias) */簇掃描(僅簇表)/*+ CLUSTER */ SELECT ... FROM emp, dept WHERE ...
INDEX/*+ INDEX(alias index_name) */指定索引掃描/*+ INDEX(emp sex_idx) */ SELECT * FROM emp WHERE sex='M'
INDEX_ASC/*+ INDEX_ASC(alias idx) */索引升序掃描/*+ INDEX_ASC(emp pk_emp) */ SELECT * FROM emp WHERE dept='SCOTT'
INDEX_DESC/*+ INDEX_DESC(alias idx) */索引降序掃描/*+ INDEX_DESC(emp pk_emp) */ SELECT * FROM emp WHERE dept='SCOTT'
INDEX_COMBINE/*+ INDEX_COMBINE(alias idx1, idx2) */位圖索引組合/*+ INDEX_COMBINE(emp sal_bmi, hiredate_bmi) */ SELECT * FROM emp WHERE sal<5000000
INDEX_JOIN/*+ INDEX_JOIN(alias idx1, idx2) */索引連接訪問/*+ INDEX_JOIN(emp sal_hmi, hiredate_bmi) */ SELECT sal, hiredate FROM emp WHERE sal<60000
INDEX_FFS/*+ INDEX_FFS(alias idx) */快速全索引掃描/*+ INDEX_FFS(emp in_empnam) */ SELECT * FROM emp WHERE dept='TEC305'
ADD_EQUAL/*+ ADD_EQUAL(alias idx1, idx2) */合併多單列索引/*+ ADD_EQUAL(emp in_dptno, in_empno, in_sex) */ SELECT * FROM emp WHERE empno='SCOTT'

三、查詢轉換類

Hint含義範例
USE_CONCATOR 條件轉 UNION ALL/*+ USE_CONCAT */ SELECT * FROM emp WHERE dept='TDC506' AND sex='M'
NO_EXPAND阻止 OR/IN-LIST 展開/*+ NO_EXPAND */ SELECT * FROM emp WHERE dept='TDC506' AND sex='M'
REWRITE啟用物化視圖重寫/*+ REWRITE(view_name) */
NO_REWRITE禁用查詢重寫/*+ NO_REWRITE */
MERGE合併視圖/子查詢/*+ MERGE(v) */ SELECT ... FROM emp a, (SELECT ...) v WHERE ...
NO_MERGE禁止合併視圖/*+ NO_MERGE(v) */ SELECT ... FROM emp a, (SELECT ...) v WHERE ...

四、連接順序與方法類

Hint含義範例
ORDERED按 FROM 子句順序連接/*+ ORDERED */ SELECT ... FROM t1, t2, t3 WHERE t1.c=t2.c AND t2.c=t3.c
LEADING指定驅動表/*+ LEADING(t1) */ SELECT ... FROM t1, t2 WHERE ...
USE_NL嵌套循環連接(指定內表)/*+ ORDERED USE_NL(emp) */ SELECT ... FROM dept, emp WHERE emp.dept=dept.dept
USE_MERGE排序合併連接/*+ USE_MERGE(emp, dept) */ SELECT * FROM emp, dept WHERE emp.dept=dept.dept
USE_HASH哈希連接/*+ USE_HASH(emp, dept) */ SELECT * FROM emp, dept WHERE emp.dept=dept.dept
DRIVING_SITE強制在指定站點執行(分布式)/*+ DRIVING_SITE(dept) */ SELECT * FROM emp, dept@remote WHERE ...

五、緩存與並行類

Hint含義範例
CACHE全表掃描塊置 LRU 熱端/*+ FULL(emp) CACHE(emp) */ SELECT ename FROM emp
NOCACHE全表掃描塊置 LRU 冷端/*+ FULL(emp) NOCACHE(emp) */ SELECT ename FROM emp
APPEND直接路徑插入(高水位標記後)INSERT /*+ APPEND */ INTO t1 SELECT * FROM t4
NOAPPEND常規插入INSERT /*+ NOAPPEND */ INTO t1 SELECT * FROM t4
PARALLEL並行執行(Oracle)/*+ PARALLEL(emp, 4) */ SELECT * FROM emp

六、MySQL 專用 Hint (8.0+)

Hint語法說明
MAX_EXECUTION_TIME/*+ MAX_EXECUTION_TIME(1000) */限制查詢最大執行時間(ms)
BKA / NO_BKA/*+ BKA(t1) */ / /*+ NO_BKA(t1) */啟用/禁用 Batched Key Access
QB_NAME/*+ QB_NAME(qb1) */為查詢塊命名,供其他 Hint 引用
RESOURCE_GROUP/*+ RESOURCE_GROUP(group_name) */指定資源組(MySQL 8.0.3+)

七、使用建議與避坑

  1. 測試驗證:Hint 非強制指令,優化器可能忽略。必須通過 EXPLAIN 驗證執行計劃是否生效。
  2. 統計信息優先:準確的統計信息比 Hint 更可靠。定期 ANALYZE TABLE。
  3. 避免過度 Hint:業務變更導致數據分布變化時,硬編碼 Hint 可能反而拖慢查詢。
  4. 版本兼容:跨版本升級時檢查 Hint 支持情況,Oracle 到 MySQL 遷移需重寫。
  5. 註釋格式:/*+ HINT */ 必須緊跟 SELECT/INSERT/UPDATE/DELETE 關鍵字後,中間無其他詞。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved