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

Oracle SQL 效能優化系列 (3):FROM 子句表順序與基礎表選擇策略

     編輯:Oracle 資料庫基礎

4. 選擇最高效的表名順序(僅限規則基礎優化器)

Oracle 解析器以「從右到左」順序處理 FROM 子句中的表名。最後寫入的表(最右側)會被最先處理,作為「基礎表」或「驅動表」。

核心原則:選擇資料筆數最少的表作為基礎表

多表聯結時,Oracle 先掃描基礎表並排序,再掃描次要表並進行合併。基礎表越小,排序與合併成本越低。

實例對比

  • TAB1:16,384 筆
  • TAB2:1 筆

最佳: SELECT COUNT(*) FROM tab1, tab2(0.96 秒)
不佳: SELECT COUNT(*) FROM tab2, tab1(26.09 秒)

將小表 TAB2 放在最右側(最後)作為基礎表,效能差距達 27 倍。

三表以上聯結:選擇交叉表

當超過三張表聯結時,應選擇「交叉表」作為基礎表——即被其他表參考最多的表(通常擁有外鍵關係的核心表)。

實例

高效: 以 EMP 為基礎表(最後)

SELECT *
FROM location l, category c, emp e
WHERE e.emp_no BETWEEN 1000 AND 2000
  AND e.cat_no = c.cat_no
  AND e.locn = l.locn;

較低效: 以 EMP 為驅動表(最前)

SELECT *
FROM emp e, location l, category c
WHERE e.cat_no = c.cat_no
  AND e.locn = l.locn
  AND e.emp_no BETWEEN 1000 AND 2000;

EMP 同時關聯 LOCATION 與 CATEGORY,是交叉表,放在最後可讓優化器先以篩選後的 EMP 小結果集驅動大表聯結。

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