SELECT A.aId,
(SELECT COUNT(1) FROM B WHERE B.aId = A.aId) c
FROM A
ORDER BY c;
表 A 30 萬行,表 B 18 萬行。去掉 ORDER BY 僅 2 秒。
SELECT 列表中,對 A 每行執行一次掃描 B(或索引範圍掃描),產生 30 萬次子查詢開銷。ORDER BY c 強制對所有行排序,需先物化子查詢結果,放大開銷。SELECT A.aId, NVL(B.cnt, 0) AS c
FROM A
LEFT JOIN (
SELECT aId, COUNT(1) AS cnt
FROM B
GROUP BY aId
) B ON A.aId = B.aId
ORDER BY B.cnt;
SELECT aId, COUNT(1) FROM B GROUP BY aId 僅掃描 B 一次,產生 aId → cnt 映射(約幾萬行)。cnt 列,排序無需再執行子查詢。CREATE INDEX idx_b_aid ON B(aId); 加速分組聚合(可選,全表掃描 18 萬行通常已足快)。CREATE INDEX idx_a_aid ON A(aId); 如 A 非主鍵。EXPLAIN PLAN FOR ...;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
觀察 HASH JOIN / SORT GROUP BY / SORT ORDER BY,無 FILTER / NESTED LOOPS 子查詢特徵。