SELECT * 解析階段需查詢數據字典展開所有欄位,增加解析 CPU;網路傳輸、客戶端緩衝區、伺服器 PGA 皆承擔無用欄位開銷。鐵律: 應用程式與視圖定義中**永遠顯式列出所需欄位**。
每條 SQL 執行觸發:解析 → 優化 → 執行計畫生成 → 綁定 → 執行 → Fetch。
優化手段:
FORALL 批次繫結。場景:需統計部門 20 與 30 的員工數與薪資和。
反模式: 兩條獨立 SELECT COUNT(*), SUM(sal) ... WHERE deptno=20 / deptno=30 — **掃描 EMP 兩次**。
正解:
SELECT COUNT(DECODE(deptno, 20, 'X')) d20_cnt,
COUNT(DECODE(deptno, 30, 'X')) d30_cnt,
SUM(DECODE(deptno, 20, sal)) d20_sal,
SUM(DECODE(deptno, 30, sal)) d30_sal
FROM emp
WHERE ename LIKE 'SMITH%';
**單次全表掃描** 完成四項聚合。同理適用於 GROUP BY、ORDER BY 分組排序邏輯。
| 維度 | DELETE | TRUNCATE |
|---|---|---|
| 類型 | DML | DDL (隱性 COMMIT) |
| Undo/Redo | 產生大量,可回滾 | 極少 (僅字典更新),不可回滾 |
| High Water Mark | 不下降 | 重置為 0 |
| 觸發器 | 觸發 ROW 級 | 不觸發 |
| 速度 | 慢 (逐行) | 極快 (元數據操作) |
適用: 清空整表、重載數據倉儲暫存表。**不可用於需保留部分行或需觸發器場景。**
每次 COMMIT 釋放:
策略: 批次處理迴圈中每 N 筆 (如 1,000~10,000) COMMIT 一次;長交易拆分為多個短交易。**注意:業務邏輯允許部分提交時才可用,否則破壞原子性。**