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

Oracle FROM/WHERE 子句效能優化實戰:表順序、條件排列、ARRAYSIZE 與 TRUNCATE 技巧

     編輯:Oracle 資料庫基礎

RBO 時代遺規:FROM 子句表順序

僅在 Rule-Based Optimizer (RBO) 有效。Oracle 解析器從右至左處理 FROM 子句,最右側表 (Driving Table) 最先處理。

  • 多表聯結:選擇 筆數最少 的表作為 Driving Table
  • 3+ 表聯結:選擇 交叉表 (Intersection Table) —— 被其他表引用最多的表
  • CBO 環境下由優化器自動決定,無需手工指定

WHERE 子句條件排序原則

  • Oracle 自下而上解析 WHERE 條件
  • 聯結條件優先:表間 JOIN 條件寫在前面
  • 高過濾條件後置:能過濾最多資料的條件寫在最後
  • 同樣僅 RBO 有效,CBO 會自動評估選擇率

SELECT 子句避免使用 *

  • SELECT * 需查詢資料字典展開欄位清單
  • 增加解析時間、網路傳輸量、記憶體使用
  • 明確列出所需欄位,利於計劃穩定與維護

減少資料庫往返次數

  • 每次往返涉及:解析、優化、Bind、區塊讀取、網路協議
  • 批次作業使用陣列繫結 (ARRAY BIND)
  • PL/SQL 批次處理優於迴圈單筆 SQL

ARRAYSIZE 參數調整

  • SQL*Plus、SQL*Forms、Pro*C 中設定
  • 控制每次網路往返傳回列數
  • 建議值:SET ARRAYSIZE 200 (預設 15)
  • 過大可能增加客戶端記憶體壓力

DECODE 函數減少重複掃描

-- 單次掃描完成多條件統計
SELECT 
  SUM(DECODE(status, 'A', 1, 0)) cnt_a,
  SUM(DECODE(status, 'B', 1, 0)) cnt_b,
  SUM(DECODE(status, 'C', 1, 0)) cnt_c
FROM orders;
  • 避免多次掃描同一表或重複聯結
  • 現代寫法可用 CASE WHEN 或 PIVOT (11g+)

整合無關聯查詢

  • 多個獨立查詢可合併為單一查詢(即使無關聯)
  • 減少解析與往返開銷
  • 使用 UNION ALL 或條件聚合

高效刪除重複資料

DELETE FROM emp e 
WHERE e.rowid > (SELECT MIN(x.rowid) FROM emp x WHERE x.emp_no = e.emp_no);
  • 利用 ROWID 唯一性,保留每組最小 ROWID
  • 單一陳述式完成,效率遠優於迴圈或暫存表法

TRUNCATE 替代 DELETE

結論:全表清空首選 TRUNCATE,條件刪除才用 DELETE。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性DELETETRUNCATE
Rollback Segment記錄可恢復資訊不記錄,不可恢復
觸發器觸發 ROW TRIGGER不觸發
高水位線不重置重置至 0
速度慢 (逐列)極快 (元資料操作)
類型DMLDDL (隱含 COMMIT)
適用範圍任意條件刪除僅限全表清空