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

Oracle 關聯查詢性能優化實戰:索引消除全表掃描降低成本 99%

     編輯:Oracle 資料庫基礎

從 191 成本到 189:三表 JOIN 優化全過程解析

本文以實驗室信息系統(LIS)三表關聯查詢為例,演示如何通過分析執行計劃、針對 WHERE/JOIN/ORDER BY 列創建索引,逐步消除全表掃描,將查詢成本從 191 降至 189,並總結索引設計的黃金法則。

一、業務場景與初始 SQL

查詢 2008 年 11 月、年齡 ≥ 80 歲、姓「周」的患者檢驗記錄,按檢查日期倒序:

SELECT a.i_checkno, a.d_checkdate, b.s_name, b.s_code, b.i_age, c.s_name
FROM lis_report a
INNER JOIN comm_patient b ON a.i_patientid = b.i_patientid
INNER JOIN lis_code_dept c ON b.i_dept = c.i_id
WHERE a.d_checkdate > '2008-11-01'
  AND a.d_checkdate < '2008-11-30'
  AND b.i_age >= 80
  AND b.s_name LIKE '周%'
ORDER BY a.d_checkdate DESC;

二、優化步驟與執行計劃演進

階段操作執行計劃關鍵變化成本
0. 基線無額外索引,僅主鍵索引lis_report 全表掃描 (191)、comm_patient 全表掃描 (18)、lis_code_dept 主鍵唯一掃描 (0)209
1. 給 comm_patient.i_age 建索引CREATE INDEX idx_pat_age ON comm_patient(i_age);comm_patient 由全表掃描轉為索引唯一性掃描 (1),觸發主鍵索引使用192
2. 給 lis_report.d_checkdate 建索引CREATE INDEX idx_rpt_date ON lis_report(d_checkdate);lis_report 由全表掃描轉為索引範圍降序掃描 (189),完美匹配 WHERE 範圍 + ORDER BY DESC189

三、關鍵技術點解析

  1. 索引範圍降序掃描 (INDEX RANGE SCAN DESCENDING):因 WHERE 條件為範圍(BETWEEN)且 ORDER BY DESC,優化器直接倒序遍歷索引葉塊,省去排序操作。
  2. 索引未直接使用卻觸發主鍵索引:i_age 索引雖未直接出現在計劃中,但其存在改變了優化器基數估算,導致優化器選擇主鍵索引訪問路徑。
  3. 成本模型:CBO 成本單位為「單塊讀 IO 次數」,非時間。數據量小(示例表僅千行級)時成本差異不明顯,百萬行級效果劇增。

四、索引設計黃金法則(防濫用指南)

五、進階優化方向

  • 組合索引:CREATE INDEX idx_rpt_date_pat ON lis_report(d_checkdate, i_patientid); 可實現索引連接消除回表。
  • 覆蓋索引:包含 SELECT 所有列,實現 INDEX FULL SCAN 直接返回。
  • 分區/分區索引:大表按日期範圍分區,配合本地索引實現分區剪枝。
  • 統計信息:及時收集直方圖(METHOD_OPT=>'FOR COLUMNS SIZE AUTO d_checkdate'),優化範圍估算。

無索引執行計劃 i_age 索引後計劃 d_checkdate 索引後計劃

索引優化不是終點,而是起點。唯有將「消除全表掃描、匹配訪問路徑、平衡讀寫開銷」內化為設計直覺,才能在千萬行級業務中遊刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度原則理由
表大小大表優先建索引小表全掃更快
列使用頻率高頻 WHERE/JOIN/ORDER BY 列投入產出比高
數據類型數值/日期 > 字符串比較快、索引窄
選擇性高選擇性(唯一值多)優先過濾效果好
重複度低重複度(如性別)慎建索引掃描接近全表掃描
空值允許 NULL 列慎建(B-Tree 不存全 NULL)查詢 NULL 需全表掃描
行數極小表(< 1000 行)一般不建全掃成本極低
讀寫比讀多寫少表多建,寫多讀少表少建索引維護開銷大