筆者從事 Oracle 開發管理 10 餘年,整理六則實戰精華與大家共勉。
HAVING 控制 GROUP BY 分組結果,條件僅能包含常數、彙總函數或 GROUP BY 中的欄位。
外部連接 (+) 分左/右連接。不帶 (+) 的表若無匹配行,將與帶 (+) 表的空行匹配並返回。善用此特性可替代效率低落的 NOT IN。
原寫法(慢):
SELECT a.empno FROM emp a WHERE a.empno NOT IN
(SELECT empno FROM emp1 WHERE job='SALE');
改寫(快):
SELECT a.empno FROM emp a, emp1 b
WHERE a.empno = b.empno(+)
AND b.empno IS NULL
AND b.job = 'SALE';
DELETE FROM table_name a
WHERE rowid < (SELECT MAX(rowid) FROM table_name
WHERE column1=a.column1 AND column2=a.column2 AND column3=a.column3 ...);
大表(>50萬筆)效率極差,需另尋他法(參考筆者《電信計費中長途重複話單技術處理》)。
大事務報 ORA-01555: snapshot too old 表示分配的 rollback segment 過小。解法:
SET TRANSACTION USE ROLLBACK SEGMENT roll_abc;
DELETE FROM table_name WHERE ...;
COMMIT;
COMMIT 後自動取消指定。
TRUNCATE 表(同時清除碎片)。IMPORT 時視圖可能因建立順序早於基底表而失敗。採兩階段法:
-- 第一階段:僅匯入結構
IMP jfcl/hfjf@ora1 FILE=expdata.dmp ROWS=N
-- 第二階段:匯入結構與資料,64KB 提交一次,忽略既有物件
IMP jfcl/hfjf@ora1 FILE=expdata.dmp FULL=Y BUFFER=64000 COMMIT=Y IGNORE=Y