LONG/LOB 外幾乎所有列可建索引ALTER INDEX REBUILD -- 低效
SELECT DISTINCT D.DEPT_NO, D.DEPT_NAME
FROM DEPT D, EMP E WHERE D.DEPT_NO = E.DEPT_NO;
-- 高效:滿足即返回,避免排序去重
SELECT D.DEPT_NO, D.DEPT_NAME
FROM DEPT D
WHERE EXISTS (SELECT 'X' FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);
StringBuilder 或綁定變量。NOT 導致全表掃描,改用 <> 或範圍查詢。-- 低效
SELECT * FROM DEPT WHERE SAL * 12 > 25000;
-- 高效:常量側計算
SELECT * FROM DEPT WHERE SAL > 25000/12;
-- 高效:直接定位 DEPTNO=4 首行
SELECT * FROM EMP WHERE DEPTNO >= 4;
-- 低效:先定位 3 再掃描
SELECT * FROM EMP WHERE DEPTNO > 3;
-- 高效
SELECT * FROM LOC WHERE LOC_ID = 10
UNION
SELECT * FROM LOC WHERE REGION = 'MELBOURNE';
-- 低效:全表掃描
SELECT * FROM LOC WHERE LOC_ID = 10 OR REGION = 'MELBOURNE';
SELECT * FROM LOC WHERE LOC_ID IN (10,20,30);
Oracle 8i+ 內部常自動轉換,但寫 IN 可讀性更好。
-- 低效:索引失效
SELECT * FROM DEPT WHERE DEPT_CODE IS NOT NULL;
-- 高效:業務主鍵通常 >= 0
SELECT * FROM DEPT WHERE DEPT_CODE >= 0;
補充:唯一索引允許多行全 NULL,但任一列非 NULL 則記錄入索引。
-- 高效:免排序
SELECT ... FROM ... WHERE TRAN_DATE = '31-DEC-95'
UNION ALL
SELECT ... FROM ... WHERE TRAN_DATE = '31-DEC-95';
UNION 需排序佔用 SORT_AREA_SIZE,UNION ALL 直接合併結果集。
-- 查看排序內存消耗
SELECT * FROM V$SORT_USAGE;
SELECT * FROM V$PARAMETER WHERE NAME = 'SORT_AREA_SIZE';