Oracle 11g r2 新建空表不分配semgent


Oracle 11g r2的新特性,延迟段创建 ,就是说从11GR2开始默认创建的表不会立及分配segment,不会占用磁盘空间,这听上去也是很合理的,当第一条数据insert时才会分配空间

试验一把

  1. sys@ANBOB> conn anbob/anbob   
  2. Connected.   
  3. anbob@ANBOB> select * from v$version;   
  4.   
  5. BANNER   
  6. --------------------------------------------------------------------------------   
  7. Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production   
  8. PL/SQL Release 11.2.0.1.0 - Production   
  9. CORE    11.2.0.1.0      Production   
  10. TNS for Linux: Version 11.2.0.1.0 - Production   
  11. NLSRTL Version 11.2.0.1.0 - Production   
  12.   
  13. anbob@ANBOB> create table testnew(id int primary key,name varchar2(10));   
  14.   
  15. Table created.   
  16. anbob@ANBOB> create table testnew_IME(id int primary key,name varchar2(10)) segment creation immediate;   
  17.   
  18. Table created.   
  19. anbob@ANBOB> create table testnew_def(id int primary key,name varchar2(10)) segment creation deferred;   
  20.   
  21. Table created.   
  22.   
  23. anbob@ANBOB> select segment_name from user_segments where segment_name like 'TESTNEW%';   
  24.   
  25. SEGMENT_NAME   
  26. ---------------------------------------------------------------------------------   
  27. TESTNEW_IME   
  28.   
  29. anbob@ANBOB>  select INDEX_NAME,TABLE_OWNER from USER_indexes where table_name='TESTNEW';   
  30.   
  31. INDEX_NAME                     TABLE_OWNER   
  32. ------------------------------ ------------------------------   
  33. SYS_C0010903                   ANBOB   
  34. anbob@ANBOB>  select INDEX_NAME,TABLE_OWNER from USER_indexes where table_name='TESTNEW_IME';   
  35.   
  36. INDEX_NAME                     TABLE_OWNER   
  37. ------------------------------ ------------------------------   
  38. SYS_C0010904                   ANBOB   
  39. anbob@ANBOB>  select INDEX_NAME,TABLE_OWNER from USER_indexes where table_name='TESTNEW_DEF';   
  40.   
  41. INDEX_NAME                     TABLE_OWNER   
  42. ------------------------------ ------------------------------   
  43. SYS_C0010905                   ANBOB   
  44.   
  45. anbob@ANBOB> select segment_name from user_segments where segment_name='SYS_C0010903';   
  46.   
  47. no rows selected   
  48.   
  49. anbob@ANBOB> select segment_name from user_segments where segment_name='SYS_C0010904';   
  50.   
  51. SEGMENT_NAME   
  52. ---------------------------------------------------------------------------------   
  53. SYS_C0010904   
  54. anbob@ANBOB> select segment_name from user_segments where segment_name='SYS_C0010905';   
  55.   
  56. no rows selected   
  57.   
  58. anbob@ANBOB> insert into testnew values(1,'anbob.com');   
  59.   
  60. 1 row created.   
  61.   
  62. anbob@ANBOB> commit;   
  63.   
  64. Commit complete.   
  65.   
  66. anbob@ANBOB> select segment_name from user_segments where segment_name like 'TESTNEW%';   
  67.   
  68. SEGMENT_NAME   
  69. ---------------------------------------------------------------------------------   
  70. TESTNEW   
  71. TESTNEW_IME   
  72.   
  73. anbob@ANBOB>  select INDEX_NAME,TABLE_OWNER from USER_indexes where table_name='TESTNEW';   
  74.   
  75. INDEX_NAME                     TABLE_OWNER   
  76. ------------------------------ ------------------------------   
  77. SYS_C0010903                   ANBOB   
  78.   
  79. anbob@ANBOB> select segment_name from user_segments where segment_name='SYS_C0010903';   
  80.   
  81. SEGMENT_NAME   
  82. ---------------------------------------------------------------------------------   
  83. SYS_C0010903   
  84. anbob@ANBOB> truncate table testnew;   
  85.   
  86. Table truncated.   
  87.   
  88. anbob@ANBOB> select segment_name from user_segments where segment_name like 'TESTNEW%';   
  89.   
  90. SEGMENT_NAME   
  91. ---------------------------------------------------------------------------------   
  92. TESTNEW   
  93. TESTNEW_IME   
  94. anbob@ANBOB> conn sys/oracle as sysdba   
  95. Connected.   
  96. sys@ANBOB> create table testnew_def(id int primary key,name varchar2(10)) segment creation deferred;   
  97. create table testnew_def(id int primary key,name varchar2(10)) segment creation deferred   
  98. *   
  99. ERROR at line 1:   
  100. ORA-14223: 此表不支持延迟创建段  

note:
11g r2默认是使用segment creation deferred建立,新建的无记录表不分配sement,当insert 第一条记录时分配段空间,不会因truncate而回收,并且在sys schema里不支持,听说exp 也不会导出

相关内容