首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle資料庫系統六大實戰經驗法則:HAVING、外部連接、去重、事務、索引、重建

     編輯:Oracle 資料庫基礎

法則一:HAVING子句精準使用規範

HAVING針對GROUP BY分組結果過濾,條件中僅允許:常數、聚合函數、GROUP BY欄位。不可直接引用非分組欄位。

法則二:外部連接(+)替代NOT IN的效能魔法

Oracle專有(+)語法實現外部連接,左連接t1.col = t2.col(+)、右連接t1.col(+) = t2.col。

經典反模式:NOT IN子查詢

-- 低效:NOT IN無法使用索引,NULL值導致語意陷阱
SELECT a.empno FROM emp a 
WHERE a.empno NOT IN (SELECT empno FROM emp1 WHERE job = 'SALE');

高效重寫:外部連接+IS NULL

-- 高效:可使用索引,邏輯清晰
SELECT a.empno 
FROM emp a, emp1 b
WHERE a.empno = b.empno(+)
AND b.empno IS NULL
AND b.job = 'SALE';

實測效能提升: 大表場景下常達10x-100x速度提升。

法則三:刪除重複記錄的標準與進階方案

標準方案(中小表)

DELETE FROM table_name a
WHERE ROWID < (
  SELECT MAX(ROWID) 
  FROM table_name 
  WHERE col1 = a.col1 AND col2 = a.col2 AND col3 = a.col3 ...);

保留每組重複資料中ROWID最大的一筆。

大表優化方案(>50萬行)

標準方案全表掃描+相關子查詢,效能不可接受。進階策略:

  1. CTAS重建法:
    CREATE TABLE new_table AS
    SELECT DISTINCT * FROM old_table;  -- 或用ROW_NUMBER()保留特定行
    DROP TABLE old_table;
    RENAME new_table TO old_table;
    -- 重建索引、約束、授權
  2. 分區交換法: 利用分區表特性,秒級切換
  3. PL/SQL分批刪除: 避免長事務與UNDO爆滿

法則四:SET TRANSACTION指定大回滾段避免ORA-01555

大事務觸發ORA-01555: snapshot too old,原因是隨機分配的回滾段過小。

解決方案:指定專用大回滾段

SET TRANSACTION USE ROLLBACK SEGMENT roll_abc;
DELETE FROM large_table WHERE ...;
COMMIT;  -- 自動釋放指定回滾段

前置條件: 預先建立足夠大小的回滾段(建議≥最大表50%)。Oracle 9i+建議改用UNDO TABLESPACE自動管理。

法則五:索引使用鐵律與碎片管理

選擇性門檻:20%法則

查詢返回行數超過總行數20%時,全表掃描通常優於索引掃描。強制使用索引反而降低效能。

索引碎片生命週期管理

  • 成因: DELETE操作釋放表空間可重用,但索引空間永不自動重用,形成碎片
  • 高頻DELETE表: 定期ALTER INDEX ... REBUILD
  • 極端情況: TRUNCATE TABLE同步清除表與索引碎片(不可回滾)

法則六:資料庫重建避坑:分離結構與資料匯入

匯入時視圖依賴基礎表,順序錯誤導致建立失敗。

兩階段匯入法

-- 階段1:僅匯入結構(無資料)
IMP userid=jfcl/hfjf@ora1 FILE=empdata.dmp ROWS=N

-- 階段2:匯入結構+資料,忽略已存在物件
IMP userid=jfcl/hfjf@ora1 FILE=empdata.dmp FULL=Y BUFFER=64000 COMMIT=Y IGNORE=Y

關鍵參數: IGNORE=Y允許物件已存在時繼續匯入資料;COMMIT=Y每64KB提交一次,防止長事務。

總結速查表

法則核心口訣適用場景
HAVING只聚合、只分組、只常數群組過濾
外部連接(+)代替NOT IN,速度飛升反向關聯查詢
去重小表ROWID,大表CTAS重複資料清理
大事務指定大回滾段,防ORA-01555批量刪除/更新
索引選擇性<20%才用,碎片定期重建查詢調優
重建先結構後資料,IGNORE=Y保平安匯入遷移

實戰建議

將這六大法則整合入團隊開發規範與DBA操作手冊,定期Code Review檢查合規性。特別注意:Oracle 12c+已棄用(+)語法,新系統應全面遷移至ANSI SQL標準LEFT/RIGHT/FULL OUTER JOIN語法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved