段的创建表user_segments

来源:互联网 发布:软件后缀名 编辑:程序博客网 时间:2024/04/28 21:57

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                                        DEFAULTT2                                                                                                              TABLE              USERS                               65536          8          1          65536                       1  2147483645                                        DEFAULTSYS_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          1T2                             TABLE              USERS                               65536          8          1SYS_C00326438                  INDEX              USERS                               65536          8          1T3                             TABLE              USERS                               65536          8          1SYS_LOB0000469684C00002$$      LOBSEGMENT         USERS                               65536          8         1SYS_IL0000469684C00002$$       LOBINDEX           USERS                               65536          8          1SYS_LOB0000469684C00003$$      LOBSEGMENT         USERS                               65536          8          1SYS_IL0000469684C00003$$       LOBINDEX           USERS                               65536          8          1SYS_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 sysdbaConnected.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          3T2                             TABLE              USERS                               65536          8          1SYS_C00326438                  INDEX              USERS                               65536          8          1T3                             TABLE              USERS                               65536          8         1SYS_LOB0000469684C00002$$      LOBSEGMENT         USERS                               65536          8          1SYS_IL0000469684C00002$$       LOBINDEX           USERS                               65536          8          1SYS_LOB0000469684C00003$$      LOBSEGMENT         USERS                               65536          8          1SYS_IL0000469684C00003$$       LOBINDEX           USERS                               65536          8          1SYS_C00326439                  INDEX              USERS                               65536          8          1 9 rows selected.


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

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