Oracle 根據條件大量刪除資料

來源:互聯網
上載者:User

標籤:

金蝶BOS裡系統資料表 t_bas_message 表用於存放系統訊息.實際操作中,用戶端預設15分鐘查詢一次是否有新訊息

使用者基本不會去刪除已讀的訊息,這就導致這張表大得驚人,系統運行一年多以來,大約有 450萬條資料.再加上這張表上存在索引,對資料庫而言,一旦操作失誤導致表中索引失效,資料庫會因為全表掃描太多徹底卡死.

之後考濾刪除一個月以前的資料執行SQL語句如下

DELETE FROM t_bas_message t WHERE t.fsendtime > Sysdate-30;

這段代碼在測試庫運行了兩個多小時.一方面是資料量很大,另一方面是因為表中有幾列索引.實際中這種方案肯定不行.


跟DBA討論了一下,有兩種方案.

A 通過表分區操作.通過表進行分區,然後直接刪除無關分區.

B 把有用的資料轉移到一張表,然後Drop 掉原表.重新建立原表後匯入資料.

B方案代碼如下

CREATE TABLE t_bas_message_bak AS SELECT * FROM  t_bas_message t WHERE t.fsendtime> Sysdate-30;DROP TABLE t_bas_message;CREATE TABLE t_bas_message AS SELECT * FROM  t_bas_message_bak;create index IX_MESSAGE_TEXT on T_BAS_MESSAGE (FRECEIVER, FORGID);create index IX_MSG_RECEIVER on T_BAS_MESSAGE (FRECEIVER);create index IX_MSG_SOURCE on T_BAS_MESSAGE (FSOURCEID);alter table T_BAS_MESSAGEadd constraint PK_BAS_BMCMESSAGE primary key (FID);DROP TABLE t_bas_message_bak;

PS:這裡的三個索引,是原表就有的,所以加上.但實際上我認為,第一個複合式索引在Oracle 中完全取代了第二個索引,應該去掉的.

Oracle 根據條件大量刪除資料

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.