FROM 子句**從右到左**解析,最後寫的表最先處理(驅動表)。多表連接時,**將結果集最小的表放最後**(或用交叉表作為驅動表)。
表連接條件**寫在最前**,過濾性最強的條件(過濾掉最多行)**寫在最後**。
* 需查詢字典轉換為所有欄位名,增加解析開銷與網路傳輸。顯式列出需要的欄位。
FORALL/BULK COLLECT。ARRAYSIZE(建議 200-500),減少 FETCH 呼叫。單次掃描內用 DECODE 或 CASE 完成多條件分支,避免重複掃描同一表或重複 JOIN。
多個獨立簡單查詢可用 UNION ALL 或單一游標合併,減少解析與網路開銷。
DELETE FROM emp e
WHERE e.rowid > (SELECT MIN(x.rowid) FROM emp x WHERE x.emp_no = e.emp_no);
保留最早插入行(MIN ROWID),其餘刪除。大表用 CTAS 重建更快。
TRUNCATE:DDL、不產生 UNDO、不觸發 Trigger、釋放 High Water Mark、秒級完成。DELETE:DML、產生 UNDO/REDO、可 Rollback、慢。批次處理中適度提交,釋放:UNDO 空間、鎖、Redo Log Buffer、內部管理開銷。避免超大交易導致回滾段暴增、鎖升級。
DBMS_STATS.GATHER_SCHEMA_STATS(建議 METHOD_OPT => 'FOR ALL COLUMNS SIZE AUTO')。V$SQL_PLAN 確認索引被使用,清理無用索引(參考 V$OBJECT_USAGE)。RESULT_CACHE 子句/模式,熱點查詢零執行。