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

Oracle SQL 調優核心四大法則:消除全表掃描、優化索引、最佳連接與排序調優

     編輯:Oracle 資料庫基礎

SQL 調優黃金目標:四大核心法則

  1. 消除不必要的大表全表掃描
  2. 小表全表掃描納入 KEEP 池快取
  3. 確保最優索引使用
  4. 確保最優連接方法

這四大法則覆蓋 90% 的 SQL 調優工作量,且無需精通內核細節。

法則一:消除不必要的大表全表掃描

判斷標準

  • 有序表:查詢回傳 < 40% 行數 → 應用索引
  • 無序表:查詢回傳 < 7% 行數 → 應用索引

手段

  • 新增標準 B-Tree 索引、Bitmap 索引、Function-based 索引
  • 對比 Index Range Scan + Table Access by Rowid vs Full Table Scan 的 I/O 成本
  • 必要時用 /*+ INDEX(t idx_name) */ Hint 強制走索引

法則二:小表全表掃描快取策略

  • Oracle 7:ALTER TABLE small_table CACHE
  • Oracle 8+:將小表放入 DB_KEEP_CACHE_SIZE(KEEP 池)
  • 確保專用資料緩衝區作為行快取,避免頻繁物理讀

法則三:最優索引選擇

  • 多索引可選時,檢查各索引選擇性、聚簇因子、欄位順序
  • Bitmap 索引適合低基數欄位(性別、狀態)且多條件 AND/OR 組合
  • Function-based 索引解決 WHERE UPPER(name) = 'SMITH' 無法用索引問題
  • 定期 ANALYZE INDEX ... VALIDATE STRUCTURE 檢查高度、葉塊、聚簇因子

法則四:最優連接方法

排序操作調優專題

觸發排序的 SQL 構造

  • ORDER BY、GROUP BY、DISTINCT
  • CREATE INDEX、UNION/INTERSECT/MINUS
  • 連接時索引不足導致 Optimizer 選擇 Merge Sort

排序記憶體架構

  • 專用連接:SORT_AREA_SIZE 於 PGA 分配
  • 共用伺服器:於 LARGE_POOL 分配
  • 所有 Session 共用同一 SORT_AREA_SIZE,無法單獨放大

磁碟排序災難:慢 14,000 倍

  • 超出 SORT_AREA_SIZE → 溢寫 TEMP 表空間
  • 消耗臨時段、佔用緩衝區塊、引發 free buffer waits
  • 監控 V$SYSSTAT 中 sorts (disk) vs sorts (memory)

調優對策

  1. 適度調大 SORT_AREA_SIZE(權衡記憶體總量)
  2. 利用 SORT_AREA_RETAINED_SIZE 保留排序記憶體
  3. 避免不必要的 ORDER BY(應用層排序)
  4. 大量排序作業考慮 PARALLEL 排序分散負載
  5. 啟用 WORKAREA_SIZE_POLICY = AUTO(9i+)讓 Oracle 自動管理 PGA 排序區

實戰調優流程

  1. 收集執行計劃:EXPLAIN PLAN / DBMS_XPLAN.DISPLAY
  2. 識別 Full Table Scan、Cartesian Product、高 Cost 操作
  3. 檢查統計資訊新鮮度:DBMS_STATS.GATHER_TABLE_STATS
  4. 嘗試 Hint/改寫 SQL/新增索引/調整參數
  5. 驗證邏輯讀、物理讀、執行時間改善

SQL 調優是「數據驅動的實驗科學」,建立基線、單一變數變更、量化對比,才是通往最優執行計劃的正道。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
連接方法適用場景關鍵條件
Nested Loops小結果集驅動大表、內表有高選擇性索引外表行數少、內表索引完美
Hash Join大表連接大表、無合適索引、記憶體充足PGA_AGGREGATE_TARGET 足夠、無排序需求
Sort Merge Join大表連接大表、已排序/需排序、RAC 環境雙方行源已排序或可接受排序成本