TABLE 設計錯誤, 無關db 是Oracle or ..., 如果不知道要如何區分可以使用, 多翻翻 TABLE PARTITION 文章.
建議你不要使用 parallel DML 方式, 除非你很懂.
建議你不要亂建 index 方式刪除, 保證你可以刪除3小時都還刪除不完.
既使時體資料5億筆資料, 要處理幾萬筆 delete or insert or update ... 都可以保證幾秒就可以完成.
範例:
CREATE TABLE mian_new1
(
xxx,
id,
...
)
PARTITION BY HASH (xxx)
(
PARTITION mian_new1
);
xxx 必須是 group 型態, 資料不可是超過 2 萬筆以上.
不知道要如何分, 可以使用 select xxx , count(*) from main group by xxx;
假設是 select xxx , id, count(*) from main group by xxx,id; 比較合理是1千筆或是1百筆, 這要看你的機器一次可以處理極限.
CREATE TABLE mian_new2
(
xxx,
id,
...
)
PARTITION BY HASH (xxx,id)
(
PARTITION mian_new2
);
你可以先簡單實驗就可以知道.
1. 先建立一個 new TABLE PARTITION , 範例 main_new
2. 在空檔時間使用 insert into main_new select * from main; 先了解insert 會花掉多少時間.
3. 在使用 delete from main_new where xxx=aa and id>12345, 會花掉多少時間.
4. 確定以上方法可以, 再找時間停機制換. 如過年期間停機轉換.
5. 轉換方式很多, 看你設計方式, 不能停機我們都是採用假日交易量少的時間.
都是先將前一天資料轉換好, 切換時間都是晚間22:00pm - 23:00pm 將原本 main table rename main_old
再將新的 main_new reanme main
再將當天資料 insert into main select * from main_old where 今天資料 or 有異動資料, 這樣就可以轉換好.
再 count main , main_old 是否一致
再 使用小程式筆對 main , main_old 資料是否一致 (for loop ...)
確定一週沒問題就會將 main_old drop 掉.
建議你就先實驗機上玩一玩你就會了解 TABLE PARTITION 好處.
切錯 TABLE PARTITION 也會快很多, 但不能保證是最快.
你可以多建立幾個 TABLE PARTITION 實驗看看就會知道了.
CREATE TABLE mian_new3
(
xxx,
id,
group_id,
...
)
PARTITION BY HASH (group_id)
(
PARTITION mian_new3
);
我家裡實驗機有12台, 所以我可以很明確知道在不同等級機器上, 那種方式是最有效率.
如果你是用 VM 方式是驗不出什的效能.
祝你好運