在我带的某个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中保留一些相关的信息。