Oracle Extent引數問題

regonly1發表於2011-12-23
      昨天碰到一個很奇怪的問題,一個表,原先有1000w+的資料。然後我做了truncate,檢查後發現,仍然站了1g+的空間,再truncate了幾次,還是沒有變化。我以為是truncate了另外一個使用者了,但是仔細一看,沒錯啊。一時急了,直接把表drop掉了。不過在drop之前,我先備份了表結構,重建總可以了吧。
      在重建的時候,我發現了問題的原因。原來這個表的initial達到了1g+,正好是檢視的大小。難怪怎麼截斷都不行呢。於是將initial引數改為1m,minextents也改為1m,建立後佔用空間就減少為1m了。
      所以,影響表佔用空間大小的不僅僅只有資料,初始化引數也有非常大的影響力。如果Initial引數設定過大,則表的初始段也會變得非常大。浪費了大量的空間。
案例:
drop table aaa purge;
create table aaa(aa int) storage(initial 1m minextents 100000 next 100 maxextents unlimited pctincrease 0) tablespace zh;

查詢其大小:
SQL> select segment_name, round(bytes/1024/1024, 4) "size(M)" from user_segments where segment_name = 'AAA';
/
 
SEGMENT_NAME                                                                        size(M)
-------------------------------------------------------------------------------- ----------
AAA                                                                                     784
 
具體Oracle還有更復雜的機制,等以後有時間可以深入研究一下。比如下面的情況:
drop table aaa purge;
create table aaa(aa int) storage(initial 1m minextents 10 next 10 maxextents unlimited pctincrease 0) tablespace zh;

查詢發現:
SQL> select segment_name, bytes, blocks, extents from user_segments where segment_name = 'AAA';
 
SEGMENT_NAME                                            BYTES     BLOCKS    EXTENTS
------------------------------------------                    ---------- ---------- ----------
AAA                                                                     2097152        256          2
 
不是建表時指定的初始化引數,這是為何?

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-713839/,如需轉載,請註明出處,否則將追究法律責任。

相關文章