zoukankan      html  css  js  c++  java
  • 段的创建表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指定每个块应该预留多少空间用于将来的更新。

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

    欢迎转载,请注明来自: www.lujinhong.com www.cnblogs.com/lujinhong2
  • 相关阅读:
    脚本绘图工具总结
    Windows Server 2012 磁盘管理之 简单卷、跨区卷、带区卷、镜像卷和RAID-5卷
    Java web项目 本地配置https调试
    Twitter的分布式自增ID算法snowflake (Java版)
    Redis压测命令
    Java读取txt文件信息并操作。
    安装配置adb工具及遇到的问题
    数据库逆向生成数据库表详细设计文档
    Java常用日期处理方法
    Date与String互相转换及日期的大小比较
  • 原文地址:https://www.cnblogs.com/lujinhong2/p/4637402.html
Copyright © 2011-2022 走看看