orcl 數據庫表中數據達到上千萬時,已經變的特別慢了,所以時不時需要清掉一部分數據。
bqh8表中目前有10000000條數據,需要保留19條數據,其余全部清除掉。
以下為個人方法:
1、首先把需要保留的數據備份到temp1臨時表中。
create table temp1 as select * from bqh8 where id<20;
select * from temp1;
2、然后再用truncate刪除整個表的數據。
truncate table bqh8;
select * from bqh8;
3、最后再把temp1表中的數據復制到bqh8表中。
insert into bqh8 select * from temp1;
commit;
select * from bqh8;
--------------------------------------------------------------------------------------------------
有人說刪除數據盡量不要用truncate,但是truncate命令速度快,占用資源少,方面快捷,如果你確定表中數據完全可以刪除的話可以用此命令。如果表中部分數據有用,那你最后備份好,否則一旦使用此命令,就呵呵了, 當然你也可以用delete。但刪除少量數據效率還行,若是幾百萬甚至幾千萬效率特別低,各有利有弊。根據實際情況而選。當然delete命令還是有好處的,如果不能保證此后的數據有不有用,但是當前不知道,或者干脆就是誤刪了,那么使用rollback命令直接回滾,當然rollback命令可以添加回滾點,定位回滾,恢復數據比較方便,所以說對與初學者,小柏強烈建議大家刪除數據時使用delete命令,雖然效率低一點,但是加保險了,親身經歷,誤用truncate命令清空了一個表,還好這個表是無關緊要的,否則我就只能呵呵受懲罰了。當然,強烈的建議是,做任何操作前,對於有用的數據都要事先備份,有備無患。
下面介紹一下truncate與delete的區別:
1、在功能上,truncate是清空一個表的內容,它相當於delete from table_name。
2、delete是dml操作,truncate是ddl操作;因此,用delete刪除整個表的數據時,會產生大量的roolback,占用很多的rollback segments, 而truncate不會。
3、在內存中,用delete刪除數據,表空間中其被刪除數據的表占用的空間還在,便於以后的使用,另外它是“假相”的刪除,相當於windows中用delete刪除數據是把數據放到回收站中,還可以恢復,當然如果這個時候重新啟動系統(OS或者RDBMS),它也就不能恢復了!
而用truncate清除數據,內存中表空間中其被刪除數據的表占用的空間會被立即釋放,相當於windows中用shift+delete刪除數據,不能夠恢復!
4、truncate 調整high water mark 而delete不;truncate之后,TABLE的HWM退回到 INITIAL和NEXT的位置(默認)delete 則不可以。
5、truncate 只能對TABLE,delete 可以是table,view,synonym。
6、TRUNCATE TABLE 的對象必須是本模式下的,或者有drop any table的權限 而 DELETE 則是對象必須是本模式下的,或被授予 DELETE ON SCHEMA.TABLE 或DELETE ANY TABLE的權限。
7、在外層中,truncate或者delete后,其占用的空間都將釋放。
8、truncate和delete只刪除數據,而drop則刪除整個表(結構和數據)。
-----------------------------------------------------------------------------------------------