在我带的某个Project中,在开发阶段需要Reload相同的Data到Oracle中来进行测试,因此需要不断的删除数据,简单的Delete操作似乎就OK了,但其实不然。我们到知道建表的时候需要Tablespace,Data有Data的Tablespace,Index有Index的Tablespace,而Oracle自身的Log,Archive也有自己的Tablespace,简单的Delete操作,能够回收Data的Tablespace,但是不能回收其他的Tablespace,从而会导致一路跑下来,虽然都是对同样的Data做Reload,但总有一天会弄爆Oracle的Tablespace,出现ORA-01654错误。
 
那么一个小技巧就是用Truncate来代替Delete,使用Truncate Table来删除所有行,比用Delete来删除有不少的好处:
 
1. Truncate Table语句是一种相对快速,无Log记录的方法,它等同于不含Where子句的Delete语句,至少表面上看来功能上相同,但Truncate Table的速度更快,并且使用更少的System Resource和Transaction Log Resource。
 
2. Truncate语句所使用的Log Tablespace较少。Delete语句每删除一行Record,都需要在Log中为每一个所删除的行进行记录,但是Truncate是通过释放用于Store Data的数据Page来删除数据,在LOong中只需要记录Page释放。
 
3. Truncate语句所使用的Lock较少。Delete语句始终锁定Table中的各行,而Truncate始终锁定Table本身和Page本身,不是Table中的各行。
 
4. Truncate语句通常不会在所删除的Table中留有空页。Delete语句执行后,Table中仍然会保留空页,而且必须至少使用一个排他表锁,LCK_M_X,才能释放堆中的空表,否则执行完Delete操作后,表或堆中会包含相当多的空页或空表,而且对于Index,Delete操作同样会留下一些空页。而Truncate操作后,只是会在DB而不是Table中保留一些相关的信息。