ITPub博客

首页 > 数据库 > Oracle > assm下oracle为什么为segment提供了shrink功能

assm下oracle为什么为segment提供了shrink功能

原创 Oracle 作者:warehouse 时间:2009-10-10 12:20:23 0 删除 编辑
通过试验简单的测试了一下assm下segment的space的分配和使用[@more@]

SQL> select tablespace_name,segment_space_management from dba_tablespaces;

TABLESPACE_NAME SEGMEN
------------------------------ ------
SYSTEM MANUAL
UNDOTBS1 MANUAL
SYSAUX AUTO
TEMP MANUAL
USERS AUTO
--users标空间是assm,system标空间是mssm,下面测试是创建的表放在这2个标空间中
SQL> create table t(id int , name varchar2(4000)) pctfree 50 tablespace users;

表已创建。

SQL> insert into t values(1,rpad('a',4000,'*'));

已创建 1 行。

SQL> insert into t values(2,rpad('b',4000,'*'));

已创建 1 行。

SQL> insert into t values(3,rpad('c',4000,'*'));

已创建 1 行。

SQL> commit;

提交完成。

SQL> select id,substr(name,1,1),rowid,dbms_rowid.rowid_relative_fno(rowid) fno,d
bms_rowid.rowid_block_number(rowid) bno from t;

ID SU ROWID FNO BNO
---------- -- ------------------ ---------- ----------
2 b AAAC4KAAEAAAAE0AAA 4 308
3 c AAAC4KAAEAAAAE1AAA 4 309
1 a AAAC4KAAEAAAAE4AAA 4 312

SQL> analyze table t compute statistics ;

表已分析。

SQL> select blocks,empty_blocks from dba_tables where table_name='T' and owner='
SYS';

BLOCKS EMPTY_BLOCKS
---------- ------------
5 3
--只插入3条数据,hwm下居然就有5个block了?
SQL> select block_id,blocks from dba_extents where owner='SYS' and segment_name=
'T';

BLOCK_ID BLOCKS
---------- ----------
305 8

SQL> select header_block from dba_segments where owner='SYS' and segment_name='T
';

HEADER_BLOCK
------------
307

SQL>
--显然block#:305,306,307是metadata,308~312可以供我们插入数据使用
SQL> alter system dump datafile 4 block 307;

系统已更改。

SQL> analyze table t compute statistics ;

表已分析。
SQL> select blocks,empty_blocks from dba_tables where table_name='T' and owner='
SYS';

BLOCKS EMPTY_BLOCKS
---------- ------------
5 3

SQL> insert into t values(4,rpad('d',4000,'*'));

已创建 1 行。

SQL> commit;

提交完成。

SQL> analyze table t compute statistics ;

表已分析。

SQL> select blocks,empty_blocks from dba_tables where table_name='T' and owner='
SYS';

BLOCKS EMPTY_BLOCKS
---------- ------------
5 3

SQL> select id,substr(name,1,1),rowid,dbms_rowid.rowid_relative_fno(rowid) fno,d
bms_rowid.rowid_block_number(rowid) bno from t;

ID SU ROWID FNO BNO
---------- -- ------------------ ---------- ----------
2 b AAAC4KAAEAAAAE0AAA 4 308
3 c AAAC4KAAEAAAAE1AAA 4 309
4 d AAAC4KAAEAAAAE3AAA 4 311
1 a AAAC4KAAEAAAAE4AAA 4 312

SQL> insert into t values(5,rpad('e',4000,'*'));

已创建 1 行。

SQL> commit;

提交完成。

SQL> analyze table t compute statistics ;

表已分析。

SQL> select blocks,empty_blocks from dba_tables where table_name='T' and owner='
SYS';

BLOCKS EMPTY_BLOCKS
---------- ------------
5 3

SQL> select id,substr(name,1,1),rowid,dbms_rowid.rowid_relative_fno(rowid) fno,d
bms_rowid.rowid_block_number(rowid) bno from t;

ID SU ROWID FNO BNO
---------- -- ------------------ ---------- ----------
2 b AAAC4KAAEAAAAE0AAA 4 308
3 c AAAC4KAAEAAAAE1AAA 4 309
5 e AAAC4KAAEAAAAE2AAA 4 310
4 d AAAC4KAAEAAAAE3AAA 4 311
1 a AAAC4KAAEAAAAE4AAA 4 312

SQL> insert into t values(6,rpad('f',4000,'*'));

已创建 1 行。

SQL> commit;

提交完成。

SQL> analyze table t compute statistics ;

表已分析。

SQL> select blocks,empty_blocks from dba_tables where table_name='T' and owner='
SYS';

BLOCKS EMPTY_BLOCKS
---------- ------------
13 3
--这里有意思的事儿出现了,assm时系统自动分配extent之后,把这个extent所包含的blocks全部纳入hwm之下了,这一点和
mssm不同,mssm时block只有被使用过时被看作是在hwm之下
SQL> select id,substr(name,1,1),rowid,dbms_rowid.rowid_relative_fno(rowid) fno,d
bms_rowid.rowid_block_number(rowid) bno from t;

ID SU ROWID FNO BNO
---------- -- ------------------ ---------- ----------
2 b AAAC4KAAEAAAAE0AAA 4 308
3 c AAAC4KAAEAAAAE1AAA 4 309
5 e AAAC4KAAEAAAAE2AAA 4 310
4 d AAAC4KAAEAAAAE3AAA 4 311
1 a AAAC4KAAEAAAAE4AAA 4 312
6 f AAAC4KAAEAAAAE/AAA 4 319

已选择6行。

SQL> delete from t where id=2;

已删除 1 行。

SQL> commit;

提交完成。

SQL> insert into t values(7,rpad('g',4000,'*'));

已创建 1 行。

SQL> commit;

提交完成。

SQL> analyze table t compute statistics ;

表已分析。

SQL> select blocks,empty_blocks from dba_tables where table_name='T' and owner='
SYS';

BLOCKS EMPTY_BLOCKS
---------- ------------
13 3

SQL> select id,substr(name,1,1),rowid,dbms_rowid.rowid_relative_fno(rowid) fno,d
bms_rowid.rowid_block_number(rowid) bno from t;

ID SU ROWID FNO BNO
---------- -- ------------------ ---------- ----------
3 c AAAC4KAAEAAAAE1AAA 4 309
5 e AAAC4KAAEAAAAE2AAA 4 310
4 d AAAC4KAAEAAAAE3AAA 4 311
1 a AAAC4KAAEAAAAE4AAA 4 312
7 g AAAC4KAAEAAAAE5AAA 4 313
6 f AAAC4KAAEAAAAE/AAA 4 319

已选择6行。

SQL> insert into t values(8,rpad('g',4000,'*'));

已创建 1 行。

SQL> insert into t values(9,rpad('g',4000,'*'));

已创建 1 行。

SQL> insert into t values(10,rpad('g',4000,'*'));

已创建 1 行。

SQL> insert into t values(11,rpad('g',4000,'*'));

已创建 1 行。

SQL> insert into t values(12,rpad('g',4000,'*'));

已创建 1 行。

SQL> insert into t values(13,rpad('g',4000,'*'));

已创建 1 行。

SQL> commit;

提交完成。

SQL> analyze table t compute statistics ;

表已分析。

SQL> select blocks,empty_blocks from dba_tables where table_name='T' and owner='
SYS';

BLOCKS EMPTY_BLOCKS
---------- ------------
13 3

SQL> select id,substr(name,1,1),rowid,dbms_rowid.rowid_relative_fno(rowid) fno,d
bms_rowid.rowid_block_number(rowid) bno from t;

ID SU ROWID FNO BNO
---------- -- ------------------ ---------- ----------
3 c AAAC4KAAEAAAAE1AAA 4 309
5 e AAAC4KAAEAAAAE2AAA 4 310
4 d AAAC4KAAEAAAAE3AAA 4 311
1 a AAAC4KAAEAAAAE4AAA 4 312
7 g AAAC4KAAEAAAAE5AAA 4 313
8 g AAAC4KAAEAAAAE6AAA 4 314
9 g AAAC4KAAEAAAAE7AAA 4 315
10 g AAAC4KAAEAAAAE8AAA 4 316
11 g AAAC4KAAEAAAAE9AAA 4 317
12 g AAAC4KAAEAAAAE+AAA 4 318
6 f AAAC4KAAEAAAAE/AAA 4 319

ID SU ROWID FNO BNO
---------- -- ------------------ ---------- ----------
13 g AAAC4KAAEAAAAFAAAA 4 320

已选择12行。

SQL> insert into t values(14,rpad('g',4000,'*'));

已创建 1 行。

SQL> commit;

提交完成。

SQL> analyze table t compute statistics ;

表已分析。

SQL> select blocks,empty_blocks from dba_tables where table_name='T' and owner='
SYS';

BLOCKS EMPTY_BLOCKS
---------- ------------
13 3

SQL> select id,substr(name,1,1),rowid,dbms_rowid.rowid_relative_fno(rowid) fno,d
bms_rowid.rowid_block_number(rowid) bno from t;

ID SU ROWID FNO BNO
---------- -- ------------------ ---------- ----------
14 g AAAC4KAAEAAAAE0AAA 4 308
3 c AAAC4KAAEAAAAE1AAA 4 309
5 e AAAC4KAAEAAAAE2AAA 4 310
4 d AAAC4KAAEAAAAE3AAA 4 311
1 a AAAC4KAAEAAAAE4AAA 4 312
7 g AAAC4KAAEAAAAE5AAA 4 313
8 g AAAC4KAAEAAAAE6AAA 4 314
9 g AAAC4KAAEAAAAE7AAA 4 315
10 g AAAC4KAAEAAAAE8AAA 4 316
11 g AAAC4KAAEAAAAE9AAA 4 317
12 g AAAC4KAAEAAAAE+AAA 4 318

ID SU ROWID FNO BNO
---------- -- ------------------ ---------- ----------
6 f AAAC4KAAEAAAAE/AAA 4 319
13 g AAAC4KAAEAAAAFAAAA 4 320

已选择13行。
--通过上面连续插入的id=8~13共6条数据我们发现hwm之下如果有"new"block(从未被使用),那么
oracle优先使用这些block,如果这些block被用完之后,会重新使用被释放出来的block:如308)
SQL> insert into t values(15,rpad('g',4000,'*'));

已创建 1 行。

SQL> commit;

提交完成。

SQL> analyze table t compute statistics ;

表已分析。

SQL> select blocks,empty_blocks from dba_tables where table_name='T' and owner='
SYS';

BLOCKS EMPTY_BLOCKS
---------- ------------
20 4

SQL>
SQL> select extent_id ,block_id, blocks from dba_extents where owner='SYS' and s
egment_name='T';

EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ----------
0 305 8
1 313 8
2 321 8

SQL>
--我们手动为segment分配的extent所包含的block在没有被使用之前始终还是在hwm之上这一点和
mssm一样;通过测试发现assm下如果extent始终是系统分配给segment的,也就是说没有我们手动分配干预,那么在hwm
之上的block全部是metadata所使用的,难怪在assm下oracle为段提供了shrink功能,因为assm下hwm下的free block似乎比
mssm下hwm下的free block"更多"...
SQL> alter table t allocate extent (size 64k datafile 'C:oradataTESTusers01.d
bf');

表已更改。

SQL> select extent_id ,block_id, blocks from dba_extents where owner='SYS' and s
egment_name='T';

EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ----------
0 305 8
1 313 8
2 321 8
3 329 8

SQL> analyze table t compute statistics ;

表已分析。

SQL> select blocks,empty_blocks from dba_tables where table_name='T' and owner='
SYS';

BLOCKS EMPTY_BLOCKS
---------- ------------
20 12

SQL>
--================================
SQL> create table tt(id int ,name varchar2(4000)) pctfree 50 tablespace system;

表已创建。
SQL> insert into tt values(1,rpad('a',4000,'*'));

已创建 1 行。

SQL> commit;

提交完成。

SQL> analyze table tt compute statistics ;

表已分析。

SQL> select blocks,empty_blocks from dba_tables where table_name='TT' and owner=
'SYS';

BLOCKS EMPTY_BLOCKS
---------- ------------
1 6

SQL> insert into tt values(2,rpad('a',4000,'*'));

已创建 1 行。

SQL> commit;

提交完成。

SQL> analyze table tt compute statistics ;

表已分析。

SQL> select blocks,empty_blocks from dba_tables where table_name='TT' and owner=
'SYS';

BLOCKS EMPTY_BLOCKS
---------- ------------
2 5
--很显然在mssm下只有block在被使用之后才被移动到hwm之下

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/19602/viewspace-1027704/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-12-07

  • 博文量
    717
  • 访问量
    5098752