SELECT *:解析期轉換列名、查詢數據字典、增加網路/IO/緩存負擔DECODE/CASE 替換多次掃描:單掃描完成多條件分支UNION ALL 或單一陳述式多結果集DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO)TRUNCATE 代替 DELETE (全表):無 Log、不觸發 Trigger、DDL 非 DML、不可回滾COMMIT:釋放 Rollback Segment、鎖、Redo Log Buffer、管理開銷WHERE 代替 HAVING:HAVING 在分組後過濾,WHERE 分組前過濾,ON 最早 (JOIN 時)ANALYTIC、KEEP 等進階函數SELECT a.col FROM table_a a JOIN table_b b ON a.id = b.idEXISTS 代替 IN:NOT IN 最差 (全表掃描+排序合併),改 NOT EXISTS 或 LEFT JOIN ... WHERE IS NULLV$SQLAREA 找 Hit_Ratio < 0.8、Reads_Per_Run 高者REBUILD,但 INSERT/UPDATE 代價 +4-5 I/OEXISTS 代替 DISTINCT:一對多查詢時,EXISTS 滿足即停止+ 拼 SQL:用 StringBuilder 或參數化NOT:導致全掃SAL*12>25000 → SAL>2083>= 代替 >:直接定位邊界值UNION 代替 OR (索引列):OR 導致全掃IN 代替 OR (同列多值):可讀性、計畫穩定IS NULL/NOT NULL:空值不存索引 (單列/全空複合),改 >=0 等UNION ALL 代替 UNION:免排序,但會重複行WHERE 代替 ORDER BY:ORDER BY 需索引列全匹配、非空、不與 WHERE 索引衝突EMP_TYPE=123 → TO_NUMBER(EMP_TYPE)=123 索引失效,顯式 CAST!=/||/+/自比較:全掃觸發器DISTINCT/UNION/MINUS/INTERSECT/ORDER BY:觸發 SORT,調大 SORT_AREA_SIZEGROUP BY 前置過濾:WHERE 先過濾再分組,比 HAVING 快