段的创建表user_segments 分类: H2_ORACLE 2013-08-10 11:13 714人阅读 评论(0) 收藏

1、段的定义及类型

Oracle中的段(segment)是占用磁盘空间的一个对象,最常见的段类型包括:

l  聚簇cluster

l  表table

l  表分区 tablepartition

l  索引 index

l  索引分区

l  Lob分区lob partition、lob子分区lobsubpartition、lob索引lobindex、lob段lob segmnent

l  嵌套表 nestedtable

l  回滚段rollback

详细介绍可见《编程艺术》P313

2、段的创建

在表、索引等创建的过程中(在11gR2中,段的创建要等到第一条数据被插入时),事实上即在创建段,从user_segment可以查看已创建的段

(1)创建一个基本表,查看所分配的段

10.2.0.4:

SQL> create table t(id number);
 
Table created.
 
SQL> select * from user_segments;
 
SEGMENT_NAME                                                                     PARTITION_NAME                SEGMENT_TYPE       TABLESPACE_NAME                     BYTES     BLOCKS   EXTENTS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE  FREELISTS FREELIST_GROUPS BUFFER_
T                                                                                                               TABLE              USERS                               65536          8         1          65536                       1  2147483645                                        DEFAULT

11gR2:

test@IRMSDC2> create table t(idnumber);
 
Table created.
 
test@IRMSDC2> select * from user_segments;
 
no rows selected
 
test@IRMSDC2> insert into t(id)values(1);
 
1 row created.
 
test@IRMSDC2> select * fromuser_segments;
 
SEGMENT_NAME                                                                     PARTITION_NAME                SEGMENT_TYPE       SEGMENT_SUTABLESPACE_NAME                         BYTES     BLOCKS   EXTENTS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS   MAX_SIZE RETENTI MINRETENTION
--------------------------------------------------------------------------------------------------------------- ------------------ ---------------------------------------- ---------- ---------- ---------- ------------------------- ----------- ----------- ---------- ------- ------------
PCT_INCREASE  FREELISTS FREELIST_GROUPS BUFFER_ FLASH_CCELL_FL
------------ ---------- ---------------------- ------- -------
T                                                                                                               TABLE              ASSM       USERS                                   65536          8          1          65536     1048576           1 2147483645 2147483645
                                        DEFAULTDEFAULT DEFAULT


由此可见,在11gR2中,只有插入数据后才会分配段空间。以下操作均在10g中进行,在11g中只要插入一条数据或者在创建表时指定segment creation immediate即可得到相同效果。

(2)创建一个带主键的表,查看所分配的段 

SQL> create table t2(id numberprimary key);
 
Table created.
 
SQL> select * fromuser_segments;            
 
SEGMENT_NAME                                                                     PARTITION_NAME                SEGMENT_TYPE       TABLESPACE_NAME                     BYTES     BLOCKS   EXTENTS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE  FREELISTS FREELIST_GROUPS BUFFER_
--------------------------------------------------------------------------------------------------------------- ------------------------------------------------ ---------- ---------- ---------- ------------------------- ----------- ----------- ------------ ---------- ----------------------
T                                                                                                               TABLE              USERS                               65536          8         1          65536                       1  2147483645                                        DEFAULT
T2                                                                                                              TABLE              USERS                               65536          8          1          65536                       1  2147483645                                        DEFAULT
SYS_C00326438                                                                                                   INDEX              USERS                               65536          8          1          65536                       1  2147483645                                        DEFAULT

(3)创建一个有lob字段的表,查看所分配的段

SQL> createtable t3(x int primary key, y clob, z blob);
 
Table created.
SQL> select segment_name,segment_type,tablespace_name,bytes,blocks,extents from user_segments;
SEGMENT_NAME                   SEGMENT_TYPE       TABLESPACE_NAME                     BYTES     BLOCKS   EXTENTS
------------------------------------------------ ------------------------------ ---------- --------------------
T                              TABLE              USERS                               65536          8          1
T2                             TABLE              USERS                               65536          8          1
SYS_C00326438                  INDEX              USERS                               65536          8          1
T3                             TABLE              USERS                               65536          8          1
SYS_LOB0000469684C00002$$      LOBSEGMENT         USERS                               65536          8         1
SYS_IL0000469684C00002$$       LOBINDEX           USERS                               65536          8          1
SYS_LOB0000469684C00003$$      LOBSEGMENT         USERS                               65536          8          1
SYS_IL0000469684C00003$$       LOBINDEX           USERS                               65536          8          1
SYS_C00326439                  INDEX              USERS                               65536          8          1
 
9 rowsselected.


由此可见,t只创建一个表的段,t2创建了一个表段以及一个索引段,t3创建了一个表段、一个索引段、2个lobindex,2个lobsegment。

结论:创建一个表时,表的信息及数据可能会分散到多个段之中,每个段保存着一部分信息,而段由区组成,区由oracle块组成,oracle块由操作系统组成。

创建一个新段时,默认由1个区、8个块组成,共计8K*8空间,默认情况下oracle块大小为8k.

SQL> show parameter block_size;
 
NAME                                 TYPE                           VALUE
------------------------------------------------------------------ ------------------------------
db_block_size                        integer                        8192

(4)插入大量数据

在表t中插入大量数据,观察段大小的变化

SQL> conn / as sysdba
Connected.
SQL> INSERT INTO test.t SELECT ROWNUMFROM dba_TABLES WHERE ROWNUM <= 10000;
 
10000 rows created.
 
SQL> conn test/test_123;
Connected.
SQL> selectsegment_name, segment_type,tablespace_name,bytes,blocks,extents fromuser_segments;
 
SEGMENT_NAME                   SEGMENT_TYPE       TABLESPACE_NAME                     BYTES     BLOCKS   EXTENTS
------------------------------------------------ ------------------------------ ---------- --------------------
T                              TABLE              USERS                              196608         24          3
T2                             TABLE              USERS                               65536          8          1
SYS_C00326438                  INDEX              USERS                               65536          8          1
T3                             TABLE              USERS                               65536          8         1
SYS_LOB0000469684C00002$$      LOBSEGMENT         USERS                               65536          8          1
SYS_IL0000469684C00002$$       LOBINDEX           USERS                               65536          8          1
SYS_LOB0000469684C00003$$      LOBSEGMENT         USERS                               65536          8          1
SYS_IL0000469684C00003$$       LOBINDEX           USERS                               65536          8          1
SYS_C00326439                  INDEX              USERS                               65536          8          1
 
9 rows selected.


可见,区增长为3个,block增长到24个,即段占用空间为24*8K。

注:字典/本地表空间管理决定了如何把空间分配给各个表,而ASSM/MSSM决定了如何把表已经拥有的空间分配给各行,以及如何管理各个区、块,如通过PCTFREE指定每个块应该预留多少空间用于将来的更新。

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2013-08-10 11:13  lujinhong2  阅读(199)  评论(0编辑  收藏  举报