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

Oracle SQL 效能優化系列講座 (二):表連接順序、WHERE 子句排序、減少資料庫往返

     編輯:Oracle 資料庫相關知識

4. 表名順序決定驅動表 (僅 RBO 有效)

Oracle 解析器由右至左處理 FROM 子句,最右側表為驅動表。選擇筆數最少的表作為驅動表效能最佳。

TAB1: 16,384 筆  TAB2: 1 筆
SELECT COUNT(*) FROM tab1, tab2;  -- 0.96 秒 (tab2 驅動)
SELECT COUNT(*) FROM tab2, tab1;  -- 26.09 秒 (tab1 驅動)

三表以上:選擇交叉表(被其他表參考的表)作為驅動表。

5. WHERE 子句條件順序 (自下而上解析)

  • 表連接條件優先寫在前面
  • 過濾力最強的條件放在最後
-- 低效 156.3 秒
SELECT ... FROM emp e WHERE sal > 50000 AND job = 'MANAGER' 
  AND 25 < (SELECT COUNT(*) FROM emp WHERE mgr = e.empno);

-- 高效 10.6 秒
SELECT ... FROM emp e 
  WHERE 25 < (SELECT COUNT(*) FROM emp WHERE mgr = e.empno)
    AND sal > 50000 AND job = 'MANAGER';

6. 避免 SELECT *

  • 解析階段需查詢資料字典展開所有欄位,增加 CPU 與字典 Cache 壓力
  • 明確列出所需欄位,利於計畫穩定與網路傳輸

7. 減少資料庫往返次數

每次 SQL 執行伴隨解析、優化、繫結、區塊讀取等內部動作。

方法SQL評價
1. 多次單獨查詢SELECT ... WHERE emp_no=342; SELECT ... WHERE emp_no=291;最差
2. 游標重複開啟DECLARE CURSOR c1(e_no) ... OPEN c1(342); OPEN c1(291);次差
3. 單次 Join 查詢SELECT a.*, b.* FROM emp a, emp b WHERE a.emp_no=342 AND b.emp_no=291;最佳

補充:ARRAYSIZE 調大

SQL*Plus、Forms、Pro*C 中設定 ARRAYSIZE=200,增加單次網路往返傳輸行數,降低往返頻率。

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