通过实验可以得知:
1.对于,即便没有真正数据,建表之后也会预分配空间
2.disable 主键取消索引空间,当重新enable,空间会发生变化。
3.PCTINCREASE参数,我经过实验,没有效果。
col SEGMENT_NAME format a20; col PARTITION_NAME format a20; col PARTITION_NAME format a10; col TABLESPACE_NAME format a20; 1.创建一个表,并添加主键 test@CISCOSYS> create table t1 (id int,name varchar2(32)); 表已创建。 test@CISCOSYS> alter table t1 add constraint pk_t1 primary key(id); 表已更改。 虽然还没有存储数据,但表及新建的索引均已分配了空间 test@CISCOSYS> select SEGMENT_NAME ,PARTITION_NAME , 2 SEGMENT_TYPE ,TABLESPACE_NAME,BYTES, 3 BLOCKS,EXTENTS ,INITIAL_EXTENT, 4 NEXT_EXTENT,MIN_EXTENTS, MAX_EXTENTS 5 from user_segments 6 where segment_name in ('T1','PK_T1'); SEGMENT_NAME PARTITION_ SEGMENT_TYPE TABLESPACE_NAME BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS -------------------- ---------- ------------------ -------------------- ---------- ---------- ---------- -------------- ----------- ----------- ----------- T1 TABLE USERS 65536 8 1 65536 1 2147483645 PK_T1 INDEX USERS 65536 8 1 65536 1 2147483645 系统默认的块大小 test@CISCOSYS> show parameter db_block_size; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_block_size integer 8192(bytes)=8K BYTES=BLOCKS*db_block_size 初始化10000条数据 test@CISCOSYS> insert into t1 select level,'n'||level from dual connect by level<=10000; 已创建10000行。 test@CISCOSYS> commit; 提交完成。 数据初始化后,索引及表的空间均增加了 test@CISCOSYS> select SEGMENT_NAME ,PARTITION_NAME , 2 SEGMENT_TYPE ,TABLESPACE_NAME,BYTES, 3 BLOCKS,EXTENTS ,INITIAL_EXTENT, 4 NEXT_EXTENT,MIN_EXTENTS, MAX_EXTENTS 5 from user_segments where segment_name in ('T1','PK_T1'); SEGMENT_NAME PARTITION_ SEGMENT_TYPE TABLESPACE_NAME BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS -------------------- ---------- ------------------ -------------------- ---------- ---------- ---------- -------------- ----------- ----------- ----------- T1 TABLE USERS 262144 32 4 65536 1 2147483645 PK_T1 INDEX USERS 196608 24 3 65536 1 2147483645 同时,可以看出系统的一个区,有8个块组成! -------------------------------------------------------------------- 将主键置为diable ,主键在段内就不能查询了,也就意味着索引删除了 test@CISCOSYS> alter table t1 disable constraint pk_t1; 表已更改。 test@CISCOSYS> select SEGMENT_NAME ,PARTITION_NAME , 2 SEGMENT_TYPE ,TABLESPACE_NAME,BYTES, 3 BLOCKS,EXTENTS ,INITIAL_EXTENT, 4 NEXT_EXTENT,MIN_EXTENTS, MAX_EXTENTS 5 from user_segments where segment_name in ('T1','PK_T1'); SEGMENT_NAME PARTITION_ SEGMENT_TYPE TABLESPACE_NAME BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS -------------------- ---------- ------------------ -------------------- ---------- ---------- ---------- -------------- ----------- ----------- ----------- T1 TABLE USERS 262144 32 4 65536 1 2147483645 重新启用又查询到了,同时发现索引占的空间增加了!!! test@CISCOSYS> alter table t1 enable constraint pk_t1; 表已更改。 test@CISCOSYS> select SEGMENT_NAME ,PARTITION_NAME , 2 SEGMENT_TYPE ,TABLESPACE_NAME,BYTES, 3 BLOCKS,EXTENTS ,INITIAL_EXTENT, 4 NEXT_EXTENT,MIN_EXTENTS, MAX_EXTENTS 5 from user_segments where segment_name in ('T1','PK_T1'); SEGMENT_NAME PARTITION_ SEGMENT_TYPE TABLESPACE_NAME BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS -------------------- ---------- ------------------ -------------------- ---------- ---------- ---------- -------------- ----------- ----------- ----------- T1 TABLE USERS 262144 32 4 65536 1 2147483645 PK_T1 INDEX USERS 262144 32 4 65536 1 2147483645 设置最初的并发事务条目(块级别) test@CISCOSYS> alter table t1 INITRANS 4; 表已更改。 查询确认 test@CISCOSYS> SELECT 2 TABLE_NAME, 3 PCT_FREE, 4 PCT_USED, 5 INI_TRANS, 6 MAX_TRANS, 7 INITIAL_EXTENT 8 from dba_tables where table_name ='T1'; TABLE_NAME PCT_FREE PCT_USED INI_TRANS MAX_TRANS INITIAL_EXTENT ---------- ---------- ---------- ---------- ---------- -------------- T1 10 4 255 65536 设置PCTUSED 参数(对于块,低于这个值,才可以插入,默认为40) PCTFREE,PCTUSED两个参数配合使用。 如果一个块的可用空间小于PCTFREE,那么不允许再插入,只能更新,删除。 当删除若干数据时,可用空间低于PCTUSED,允许插入。 test@CISCOSYS> alter table t1 storage(next 50k) 2 ; alter table t1 storage(next 50k) * 第 1 行出现错误: ORA-25150: 不允许对区参数执行 ALTERING 表空间使用本地管理,其中的表不能修改NEXT MAXEXTENTS和PCTINCREASE参数 sys@CISCOSYS> create table t2(id int,name varchar2(32)) storage(initial 10k); 表已创建。 SELECT TABLE_NAME, PCT_FREE, PCT_USED, INI_TRANS, MAX_TRANS, INITIAL_EXTENT from dba_tables where table_name in ('T1','T2','T3'); test@CISCOSYS> SELECT 2 TABLE_NAME, 3 PCT_FREE, 4 PCT_USED, 5 INI_TRANS, 6 MAX_TRANS, 7 INITIAL_EXTENT 8 from dba_tables where table_name in ('T1','T2','T3'); TABLE_NAME PCT_FREE PCT_USED INI_TRANS MAX_TRANS INITIAL_EXTENT ---------- ---------- ---------- ---------- ---------- -------------- T2 10 40 1 255 16384 T3 10 1 255 65536 T1 10 4 255 65536 select SEGMENT_NAME ,PARTITION_NAME , SEGMENT_TYPE ,TABLESPACE_NAME,BYTES, BLOCKS,EXTENTS ,INITIAL_EXTENT, NEXT_EXTENT,MIN_EXTENTS, MAX_EXTENTS from dba_segments where segment_name in ('T3','T2','T3); 指定的initial=17K.系统会根据系统指定块大小,最近的整数倍(2*8<17k<3*8) create table t4(id int,name varchar2(32)) storage(initial 17k); test@CISCOSYS> select SEGMENT_NAME ,PARTITION_NAME , 2 SEGMENT_TYPE ,TABLESPACE_NAME,BYTES, 3 BLOCKS,EXTENTS ,INITIAL_EXTENT, 4 NEXT_EXTENT,MIN_EXTENTS, MAX_EXTENTS 5 from dba_segments 6 where segment_name in ('T3','T2','T4'); SEGMENT_NAME PARTITION_ SEGMENT_TYPE TABLESPACE_NAME BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS -------------------- ---------- ------------------ -------------------- ---------- ---------- ---------- -------------- ----------- ----------- ----------- T2 TABLE SYSTEM 65536 8 1 16384 1 2147483645 T3 TABLE USERS 65536 8 1 65536 1 2147483645 T4 TABLE USERS 65536 8 1 24576 1 2147483645 test@CISCOSYS> SELECT 24576/1024 from dual; 24576/1024 ---------- 24 明确段与块的关系 test@CISCOSYS> select * from dba_extents where segment_NAME='T1'; OWNER SEGMENT_NAME PARTITION_ SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES ------------------------------ -------------------- ---------- ------------------ -------------------- ---------- ---------- ---------- ---------- TEST T1 TABLE USERS 0 5 721 65536 TEST T1 TABLE USERS 1 5 745 65536 TEST T1 TABLE USERS 2 5 753 65536 TEST T1 TABLE USERS 3 5 769 65536 test@CISCOSYS> SELECT SEGMENT_NAME,EXTENTS FROM DBA_SEGMENTS WHERE SEGMENT_NAME='T1'; SEGMENT_NAME EXTENTS -------------------- ---------- T1 4 测试pctincrease参数(发现没有效果) test@CISCOSYS> create table t2 (id int,name varchar2(32)) storage(pctincrease 20); 表已创建。 test@CISCOSYS> insert into t2 select level,'name'||level from dual connect by level <=10000; 已创建10000行。 test@CISCOSYS> commit; 提交完成。 test@CISCOSYS> select * from dba_extents where segment_NAME='T2'; OWNER SEGMENT_NAME PARTITION_ SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RE ------------------------------ -------------------- ---------- ------------------ -------------------- ---------- ---------- ---------- ---------- ---------- SYS T2 TABLE SYSTEM 0 1 59497 65536 8 TEST T2 TABLE USERS 0 4 5793 65536 8 TEST T2 TABLE USERS 1 4 5801 65536 8 TEST T2 TABLE USERS 2 4 5809 65536 8 TEST T2 TABLE USERS 3 4 5817 65536 8--