開發測試發現:加上 DISTINCT 查詢 4 分鐘完成,不加跑 10+ 分鐘無結果。DISTINCT 位於最外層,非子查詢。
-- 建表與統計資訊收集
CREATE TABLE T1 AS SELECT * FROM DBA_OBJECTS WHERE OWNER='SYS' AND OBJECT_TYPE NOT LIKE '%BODY' AND OBJECT_TYPE NOT LIKE 'Java%';
CREATE TABLE T2 AS SELECT * FROM DBA_SEGMENTS WHERE OWNER='SYS';
CREATE TABLE T3 AS SELECT * FROM DBA_INDEXES WHERE OWNER='SYS';
-- PK、索引、統計資訊皆已建立
SELECT T1.OBJECT_NAME, T1.OBJECT_TYPE, T2.TABLESPACE_NAME
FROM T1, T2
WHERE T1.OBJECT_NAME = T2.SEGMENT_NAME
AND T1.OBJECT_NAME IN (
SELECT INDEX_NAME FROM T3 WHERE T3.TABLESPACE_NAME = T2.TABLESPACE_NAME
);
-- 邏輯讀 93,採用 HASH JOIN (SEMI),成本 12
SELECT DISTINCT T1.OBJECT_NAME, T1.OBJECT_TYPE, T2.TABLESPACE_NAME
FROM T1, T2
WHERE T1.OBJECT_NAME = T2.SEGMENT_NAME
AND T1.OBJECT_NAME IN (
SELECT INDEX_NAME FROM T3 WHERE T3.TABLESPACE_NAME = T2.TABLESPACE_NAME
);
-- 邏輯讀 72,採用 HASH JOIN + SORT (UNIQUE),成本 16
保持開放心態,以執行計畫與實測為準,才是效能調校的正道。