在我帶的某個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中保留一些相關的信息。