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

Oracle WHERE 條件順序對執行計畫影響實測分析

     編輯:關於SqlServer

問題背景

傳統觀點認為 WHERE 條件順序影響查詢效能,特別是舊版 Oracle (Rule-based Optimizer 時代)。本文透過 Oracle 10g 實測,驗證在 CBO (Cost-Based Optimizer) 模式下,條件順序是否仍影響執行計畫。

測試環境

  • 資料庫:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
  • 測試表:HR.COUNTRIES、HR.REGIONS (標準範例結構)
  • 工具:SQL*Plus,啟用 AUTOTRACE

測試語句對比

方式 1:先連接後過濾

SELECT * 
FROM hr.COUNTRIES c, hr.REGIONS r 
WHERE c.REGION_ID = r.REGION_ID 
  AND c.REGION_ID = '4';

方式 2:先過濾後連接

SELECT * 
FROM hr.COUNTRIES c, hr.REGIONS r 
WHERE c.REGION_ID = '4' 
  AND c.REGION_ID = r.REGION_ID;

執行計畫與統計對比

指標方式 1方式 2
Plan Hash Value40305132964030513296
OperationsNESTED LOOPS → INDEX UNIQUE SCAN (REGIONS) → INDEX FULL SCAN (COUNTRIES)完全相同
Predicate Access"R"."REGION_ID"=4 (access), "C"."REGION_ID"=4 (filter)完全相同
Consistent Gets127131
Physical Reads2022
Recursive Calls628656

結論分析

  1. 執行計畫完全一致:Plan Hash Value 相同,操作順序、存取路徑無差異。
  2. CBO 自動優化:優化器會根據統計資訊重新排序謂詞,條件書寫順序不影響最終計畫。
  3. 微小統計差異:Consistent Gets 等統計值略有波動,屬正常執行抖動,非結構性差異。
  4. 適用版本:Oracle 10g 及以上版本 (CBO 預設) 均無需刻意調整 WHERE 順序。

最佳實踐建議

  • 專注於統計資訊收集 (DBMS_STATS.GATHER_TABLE_STATS)、索引設計、SQL 寫法規範 (使用 ANSI JOIN 語法)
  • 複雜查詢可使用 /*+ ORDERED */ 或 /*+ LEADING */ Hint 強制連接順序
  • 避免在 WHERE 條件對欄位使用函數/運算導致索引失效
  • 定期檢查 V$SQL_PLAN 驗證實際執行計畫

現代 Oracle 優化器已足夠智能,開發者應將精力投入於統計維護、索引策略與業務邏輯優化,而非條件順序微調。

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