Oracle 9i 引入 WITH 子句 (Subquery Factoring),可將子查詢命名並前置,大幅提升可讀性與效能。
WITH
SEG AS (SELECT SEGMENT_NAME, SUM(BYTES)/1024 K FROM USER_SEGMENTS GROUP BY SEGMENT_NAME),
OBJ AS (SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS)
SELECT O.OBJECT_NAME, OBJECT_TYPE, NVL(S.K, 0) SIZE_K
FROM OBJ O, SEG S
WHERE O.OBJECT_NAME = S.SEGMENT_NAME (+);
WITH
Q1 AS (SELECT 3 + 5 S FROM DUAL),
Q2 AS (SELECT 3 * 5 M FROM DUAL),
Q3 AS (SELECT S, M, S + M, S * M FROM Q1, Q2)
SELECT * FROM Q3;
-- 結果: S=8, M=15, S+M=23, S*M=120
測試環境:10 萬筆測試表 T_WITH,查詢 ID 最小、最大、平均值對應記錄。
SELECT ID, NAME FROM T_WITH
WHERE ID IN (
SELECT MAX(ID) FROM T_WITH
UNION ALL
SELECT MIN(ID) FROM T_WITH
UNION ALL
SELECT TRUNC(AVG(ID)) FROM T_WITH
);
WITH STATS AS (
SELECT MAX(ID) MAX_ID, MIN(ID) MIN_ID, TRUNC(AVG(ID)) AVG_ID FROM T_WITH
)
SELECT ID, NAME FROM T_WITH, STATS
WHERE ID IN (STATS.MAX_ID, STATS.MIN_ID, STATS.AVG_ID);
WITH 版本僅掃描一次表,統計資訊暫存後多次引用,顯著降低 Consistent Gets 與 Physical Reads。