Oracle 11gR2新建空表不分配Segment


一、引言:

在看《收獲,不止Oracle》的神奇,走進邏輯體系世界一章時,需要新建一張表查看Extents的情況,由於該書的環境是ORACLE10G的,因此新建空表以后立刻就分配Segment,而我使用的是Oracle11gR2,新建空表后沒有立即分配Segment。這就是11GR2的新特性,延遲段創建,就是說從11GR2開始默認創建的表不會立即分配segment,不會占用磁盤空間,當第一條數據insert時才會分配空間。

二、實驗模擬:

SQL> select * from v$version;  
 
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0    Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SQL> create table testnew(id int primary key,name varchar2(10));  
 
Table created
 
SQL> create table testnew_IME(id int primary key,name varchar2(10)) segment creation immediate; 
 
Table created
 
SQL> create table testnew_def(id int primary key,name varchar2(10)) segment creation deferred;  
 
Table created
 
SQL> select segment_name from user_segments where segment_name like 'TESTNEW%';  
 
SEGMENT_NAME
--------------------------------------------------------------------------------
TESTNEW_IME
 
SQL> select INDEX_NAME,TABLE_OWNER from USER_indexes where table_name='TESTNEW';  
 
INDEX_NAME                     TABLE_OWNER
------------------------------ ------------------------------
SYS_C0011192                   JACK
 
SQL> select INDEX_NAME,TABLE_OWNER from USER_indexes where table_name='TESTNEW_IME';  
 
INDEX_NAME                     TABLE_OWNER
------------------------------ ------------------------------
SYS_C0011193                   JACK
 
SQL> select INDEX_NAME,TABLE_OWNER from USER_indexes where table_name='TESTNEW_DEF';  
 
INDEX_NAME                     TABLE_OWNER
------------------------------ ------------------------------
SYS_C0011194                   JACK
 
SQL> select segment_name from user_segments where segment_name='SYS_C0011192';  
 
SEGMENT_NAME
--------------------------------------------------------------------------------
 
SQL> select segment_name from user_segments where segment_name='SYS_C0011193';
 
SEGMENT_NAME
--------------------------------------------------------------------------------
SYS_C0011193
 
SQL> select segment_name from user_segments where segment_name='SYS_C0011194';
 
SEGMENT_NAME
--------------------------------------------------------------------------------
 
SQL> insert into testnew values(1,'anbob.com');  
 
1 row inserted
 
SQL> commit;
 
Commit complete
 
SQL> select segment_name from user_segments where segment_name like 'TESTNEW%';  
 
SEGMENT_NAME
--------------------------------------------------------------------------------
TESTNEW
TESTNEW_IME
 
SQL> select INDEX_NAME,TABLE_OWNER from USER_indexes where table_name='TESTNEW';  
 
INDEX_NAME                     TABLE_OWNER
------------------------------ ------------------------------
SYS_C0011192                   JACK
 
SQL> select segment_name from user_segments where segment_name='SYS_C0011192';
 
SEGMENT_NAME
--------------------------------------------------------------------------------
SYS_C0011192
 
SQL> truncate table testnew;  
 
Table truncated
 
SQL> select segment_name from user_segments where segment_name like 'TESTNEW%';  
 
SEGMENT_NAME
--------------------------------------------------------------------------------
TESTNEW
TESTNEW_IME

SQL> conn /as sysdba
已連接。
SQL> create table testnew_def(id int primary key,name varchar2(10)) segment creation deferred;  
create table testnew_def(id int primary key,name varchar2(10)) segment creation deferred
*1 行出現錯誤:
ORA-14223: 此表不支持延遲創建段

注意:
11gR2默認是使用segment creation deferred建立,新建的無記錄表不分配segment,當insert第一條記錄時分配段空間,不會因truncate而回收,並且在sys schema里不支持,exp也不會導出。

關於這個主要還是跟deferred_segment_creation參數有關,在11gR2中該參數的值為true,說明當創建對象(如表),初始沒有數據,不會立即創建segment。

如果該參數設置為false,表明之后的創建的表,初始沒有數據,會立即創建segment。

下面看一下它的效果:

SQL> alter system set deferred_segment_creation=false;
 
System altered
 
SQL> create table jack(x int);
 
Table created

SQL> select segment_name,segment_type,extents,blocks from user_segments where segment_name='JACK';
 
SEGMENT_NAME                                                                     SEGMENT_TYPE          EXTENTS     BLOCKS
-------------------------------------------------------------------------------- ------------------ ---------- ----------
JACK                                                                             TABLE                       1          8

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM