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

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