程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> 關於Oracle數據庫 >> Oracle比較快的刪除重復數據的方式

Oracle比較快的刪除重復數據的方式

編輯:關於Oracle數據庫

       網上五花八門刪除重復數據的方法就是沒見過這種:

      DELETE FROM prod_grid_inc

      WHERE ROWID IN (SELECT b.row_id2

      FROM (SELECT ROWID row_id2,

      a.*,

      row_number() over(PARTITION BY a.prod_id ORDER BY a.insert_date DESC) row_num

      FROM prod_grid_inc a) b

      WHERE b.row_num >= 2);

      大家不妨試試,經過試驗,的確快了不少。

      如果是幾G的大表(這種時候一般是分區表),這種情況最好是append+nologging方式,將唯一記錄insert到臨時表中,然後通過交換分區的方式交換過去,前後只需要幾分鐘,其中臨時表的表空間和索引表空間要符合正式表的要求:

      eg:

      INSERT /*+append*/ INTO ACCT_ITEM_MID

      SELECT *

      FROM ACCT_ITEM SUBPARTITION(P_201109_SUB_P_XX) a

      WHERE ROWID = (SELECT MAX(ROWID)

      FROM ACCT_ITEM SUBPARTITION(P_201109_SUB_P_XX) a1

      WHERE a.cust_id = a1.cust_id);

      COMMIT;

      ALTER TABLE ACCT_ITEM EXCHANGE SUBPARTITION P_201109_SUB_P_XX WITH TABLE ACCT_ITEM_MID;

      當然exchange的方式雖然快,但是這種情況會導致索引失效,需要重建索引:

      alter index ind_name rebuild subpartition subpartition_name;

      如此即可。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved