首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

資深 DBA 實戰心法:Oracle 使用經驗六則

     編輯:Oracle 資料庫相關知識

前言

筆者從事 Oracle 開發管理 10 餘年,整理六則實戰精華與大家共勉。

1. HAVING 子句用法

HAVING 控制 GROUP BY 分組結果,條件僅能包含常數、彙總函數或 GROUP BY 中的欄位。

2. 外部連接 (+) 替代 NOT IN 提升效能

外部連接 (+) 分左/右連接。不帶 (+) 的表若無匹配行,將與帶 (+) 表的空行匹配並返回。善用此特性可替代效率低落的 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';

3. 刪除重複資料

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萬筆)效率極差,需另尋他法(參考筆者《電信計費中長途重複話單技術處理》)。

4. SET TRANSACTION 指定大型 Rollback Segment

大事務報 ORA-01555: snapshot too old 表示分配的 rollback segment 過小。解法:

SET TRANSACTION USE ROLLBACK SEGMENT roll_abc;
DELETE FROM table_name WHERE ...;
COMMIT;

COMMIT 後自動取消指定。

5. 索引使用注意事項

  • 子查詢回傳行數應 < 20% 總行數,超過則索引無助效能。
  • 頻繁刪除的索引表會產生碎片(索引釋放空間不可重用),需定期重建索引或 TRUNCATE 表(同時清除碎片)。

6. 匯入重建資料庫時的視圖依序問題

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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved