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 小結果集驅動大表聯結。