標籤:
金蝶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 根據條件大量刪除資料