???? oracle有個數據表現在已經有2500萬條數據了,軟件用到這個表的數據時就變的特別慢,所以準備把一個月以前的數據全部清除。
???? 我的步驟是(下邊操作都是在plsql中運行的)
?1、首先 將這個月的數據導出到一個臨時表中(這些數據是自己希望保留的)
?? create table tempTable as select id,name from?table1 where sj>to_date('2013-7-31 23:59:59','yyyy-mm-dd hh24:mi:ss');
2、然后將2500萬數據整個刪除(這個是我在有備份情況下才用的)
truncate table table1;?
3、然后將整個表刪除(因為事先從網上查了下,有網友說truncate后,直接把數據從臨時表導回來事個數據文件沒有變小,自己沒有試)
drop table table1;
4、將數據從臨時表全部導回來
create table?table1 as select id,name from?tempTable;
5、然后刪除臨時表
drop table tempTable;
這樣整個過程用了大概10分鐘左右就完成了。
以上僅是自己操作心得,如有不正確或者更好的方法希望大家指正。
附:來自 http://www.cnblogs.com/simplefrog/archive/2012/07/30/2615169.html
語法 delete from aa truncate table aa
區別 1.delete from后面可以寫條件,truncate不可以。
2.delete from記錄是一條條刪的,所刪除的每行記錄都會進日志,而truncate一次性刪掉整個頁,因此日至里面只記錄頁釋放,簡言之,delete from更新日志,truncate基本不,所用的事務日志空間較少。
3.delete from刪空表后,會保留一個空的頁,truncate在表中不會留有任何頁。
4.當使用行鎖執行 DELETE 語句時,將鎖定表中各行以便刪除。truncate始終鎖定表和頁,而不是鎖定各行。
5.如果有identity產生的自增id列,delete from后仍然從上次的數開始增加,即種子不變,而truncate后,種子會恢復初始。
6.truncate不會觸發delete的觸發器,因為truncate操作不記錄各個行刪除。
總結 1.truncate和 delete只刪除數據不刪除表的結構(定義)???? ?? drop語句將刪除表的結構被依賴的約束(constrain),觸發器(trigger),索引(index); 依賴于該表的存儲過程/函數將保留,但是變為invalid狀態。
? 2.delete語句是dml,這個操作會放到rollback segement中,事務提交之后才生效;如果有相應的trigger,執行的時候將被觸發 ??? truncate,drop是ddl, 操作立即生效,原數據不放到rollback segment中,不能回滾. 操作不觸發trigger。
? 3.delete語句不影響表所占用的extent, 高水線(high watermark)保持原位置不動???? ?? 顯然drop語句將表所占用的空間全部釋放???? ?? truncate 語句缺省情況下見空間釋放到 minextents個 extent,除非使用reuse storage;?? truncate會將高水線復位(回到最開始)。
? 4.速度,一般來說: drop> truncate > delete。
???? 5.安全性:小心使用drop 和truncate,尤其沒有備份的時候.否則哭都來不及。
6.使用上,想刪除部分數據行用delete,注意帶上where子句. 回滾段要足夠大.???? 想刪除表,當然用drop???? 想保留表而將所有數據刪除. 如果和事務無關,用truncate即可. 如果和事務有關,或者想觸發trigger,還是用delete 如果是整理表內部的碎片,可以用truncate跟上reuse stroage,再重新導入/插入數據。
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
