在Oracle 11gr2中创建表所采用的默认模式是延迟段创建(deferred segment creation),即create table时,不会分配任何存储空间,要延迟到insert时才会真正创建段(segment),下面通过一个小例子来说明:
1. 11gr2之前:1) 确认数据库版本:
A105024@O02DMS1>select * from v$version where rownum<2;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
2) 创建测试表:
A105024@O02DMS1>create table test (id number);
Table created.
3) 查看空间分配情况:
A105024@O02DMS1>select segment_name,EXTENTS,BLOCKS,BYTES from user_segments where segment_name='TEST';
SEGMENT_NAME EXTENTS BLOCKS BYTES
------------------------------------ ---------- ---------- ----------
TEST 1 8 65536
可以发现在11gr2之前,创建表的同时就已经为该表默认分配了一个8 block的segment。
2. 11gr2:1) 确认数据库版本:
A105024@O07DMS0>select * from v$version where rownum<2;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
2) 创建测试表:
A105024@O07DMS0>create table test (id number);
Table created.
3) 查看空间分配情况:
A105024@O07DMS0>select segment_name,EXTENTS,BLOCKS,BYTES from user_segments where segment_name='TEST';
no rows selected
可以发现在11gr2中,创建表并不为该表分配任何空间。
4) 插入数据:
A105024@O07DMS0>insert into test values(1);
1 row created.
5) 再次查看空间分配情况:
A105024@O07DMS0>select segment_name,EXTENTS,BLOCKS,BYTES from user_segments where segment_name='TEST';
SEGMENT_NAME EXTENTS BLOCKS BYTES
-------------------------------------------- ---------- ----------
TEST 1 128 1048576
可以看到知道第一个insert后,才真正为表分配空间。
11gr2中这样做无非就是为了节省空间,不过本人倒是觉得这样节省下来的空间很少,却带来了一些意想不到的坏处,比如我就曾碰到用exp/expdp无法导出延迟段创建的表,导致用imp/impdp导入时丢失了这些表的定义。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26277071/viewspace-708835/
,如需转载,请注明出处,否则将追究法律责任。