Home  >  Article  >  Database  >  ORACLE空间管理实验2:区的管理与分配

ORACLE空间管理实验2:区的管理与分配

WBOY
WBOYOriginal
2016-06-07 16:21:011156browse

内容基于LMT管理的表空间,字典管理已经不用了。 本篇主要验证了这些问题: 1.LMT管理的表空间,区的分配有两种方法: 系统分配和UNIFORM固定大小--见实验 2.验证Oracle找寻可用区的方式: 从数据文件开头的位图块中获得可用区的信息,DUMP时可见FIRST:3这种

  内容基于LMT管理的表空间,字典管理已经不用了。

本篇主要验证了这些问题:

1.LMT管理的表空间,区的分配有两种方法:
系统分配和UNIFORM固定大小-->见实验

2.验证Oracle找寻可用区的方式:
从数据文件开头的位图块中获得可用区的信息,DUMP时可见FIRST:3这种,表示已经使用3个区。详见:点击打开链接

3.在表空间中建第一个表(注意,第一个),这个表从数据文件的第几个块开始使用
11G下,LMT管理的表空间,数据文件中0-127号块做位图区域用,第128个块才开始存放表的数据。详见:

4.最小的表-最小的区多大?
5个BLOCK,如果BLOCK大小是8K,则最小的表是40K。--见下面实验

5.表空间中多个数据文件如何分配空间?
多个数据文件上平均分配--见下面实验
#####################################################################

实验一:系统管理区大小和统一区大小的区别是什么,如何验证这个区别?

系统管理区大小由系统自动分配扩展的区大小,
在段的前1M空间:区大小8个块=64K,前16个区是这样。
在段1M---64M之间:区大小1M,128个块
在段64M之后,区大小8M。
可以在系统管理区的表空间内创建表,,然后手动分配1个extent,然后依次扩展960K空间,1M空间,62M空间,然后再扩展一个extent的方式来测试。alter table a1 allocate extent (SIZE 1m);
统一区大小则由创建表空间时uniform size 40k;子句指定.
可以先创建两个不同管理方式的表空间,再分别在此两个表空间创建两个表,手动扩展区,再通过dba_segments来查看。

BYS@ bys3>select tablespace_name,block_size,INITIAL_EXTENT,next_extent,EXTENT_MANAGEMENT,ALLOCATION

_TYPE,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces where tablespace_name like 'TEST_';
TABLESPACE_NAME BLOCK_SIZE INITIAL_EXTENT NEXT_EXTENT EXTENT_MAN ALLOCATIO SEGMEN
--------------- ---------- -------------- ----------- ---------- --------- ------
TEST1 8192 65536 LOCAL SYSTEM AUTO
TEST2 8192 40960 40960 LOCAL UNIFORM AUTO
TEST3 8192 65536 LOCAL SYSTEM AUTO
BYS@ bys3>select * from cat;
TABLE_NAME TABLE_TYPE
------------------------------ -----------
DEPT TABLE
BYS@ bys3>create table test1(aa int) tablespace test1;
Table created.
BYS@ bys3>create table test2(aa int) tablespace test2;
Table created.
BYS@ bys3>insert into test1 values(789);
BYS@ bys3>insert into test2 values(789);
BYS@ bys3>commit;
Commit complete.
BYS@ bys3>select segment_name,tablespace_name,bytes,blocks,extents,initial_extent,next_extent from dba_segments where owner='BYS' and segment_name like 'TEST_';
SEGMENT_NAME TABLESPACE_NAME BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT
--------------- --------------- ---------- ---------- ---------- -------------- -----------
TEST1 TEST1 65536 8 1 65536 1048576
TEST2 TEST2 40960 5 1 40960 40960
BYS@ bys3>alter table test1 allocate extent;
Table altered.
BYS@ bys3>alter table test2 allocate extent;
Table altered.
BYS@ bys3>select segment_name,tablespace_name,bytes,blocks,extents,initial_extent,next_extent from dba_segments where owner='BYS' and segment_name like 'TEST_';
SEGMENT_NAME TABLESPACE_NAME BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT
--------------- --------------- ---------- ---------- ---------- -------------- -----------
TEST1 TEST1 131072 16 2 65536 1048576
TEST2 TEST2 81920 10 2 40960 40960
BYS@ bys3>alter table test2 allocate extent (size 2m); --2M,系统自动扩展区,此时一个区大小是1M,所以此语句扩展两个区,此时4个区
Table altered.
BYS@ bys3>alter table test1 allocate extent (size 2m);-UNIFORM SIZE 40K,2048/40=51.2,分配51个区--四舍五入。此时是54个区。
Table altered.
BYS@ bys3>select segment_name,tablespace_name,bytes,blocks,extents,initial_extent,next_extent from dba_segments where owner='BYS' and segment_name like 'TEST_';

SEGMENT_NAME TABLESPACE_NAME BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT
--------------- --------------- ---------- ---------- ---------- -------------- -----------
TEST1 TEST1 2228224 272 4 65536 1048576
TEST2 TEST2 2170880 265 53 40960 40960

BYS@ bys3>alter table test2 allocate extent (size 110k); --这里的分配区间好像用的四舍五入,比如这里的110k/40K=2.75,分配了三个区
Table altered.
BYS@ bys3>select segment_name,tablespace_name,bytes,blocks,extents,initial_extent,next_extent from dba_segments where owner='BYS' and segment_name like 'TEST_';
SEGMENT_NAME TABLESPACE_NAME BYTES BLOCKS EXTENTS INITIAL_EXTENT NEXT_EXTENT
--------------- --------------- ---------- ---------- ---------- -------------- -----------
TEST1 TEST1 2228224 272 4 65536 1048576
TEST2 TEST2 2293760 280 56 40960 40960

实验二:一个表至少多大?

在ASSM下,一个区最少5个块。
而一个普通堆表是一个段,一个段最少包含一个区,一个区最少包含5个块,所以当表空间block是8K时,表至少40K。
实验如下:
BYS@ bys3>create tablespace test2 datafile '/u01/oradata/bys3/test2.dbf' size 10m uniform size 32k;
create tablespace test2 datafile '/u01/oradata/bys3/test2.dbf' size 10m uniform size 32k
*
ERROR at line 1:
ORA-03249: Uniform size for auto segment space managed tablespace should have atleast 5 blocks
这一句报错信息可以看到,一个区需要至少5个数据块。
BYS@ bys3>create tablespace test2 datafile '/u01/oradata/bys3/test2.dbf' size 10m uniform size 40k;
Tablespace created.
BYS@ bys3>create table test16(bb int) tablespace test2 storage (initial 1k maxextents 1);
Table created.
BYS@ bys3>insert into test16 values(999);
1 row created.
BYS@ bys3>commit;
Commit complete.
BYS@ bys3>select a.SEGMENT_NAME,a.bytes/1024 segment_byte,a.TABLESPACE_NAME,b.INITIAL_EXTENT,b.BLOCK_SIZE,b.ALLOCATION_TYPE from dba_segments a,dba_tablespaces b where a.owner='BYS' and a.segment_name like 'TEST1_' and a.tablespace_name=b.tablespace_name;
SEGMENT_NA SEGMENT_BYTE TABLESPACE_NAME INITIAL_EXTENT BLOCK_SIZE ALLOCATIO
---------- ------------ ------------------------------ -------------- ---------- ---------
TEST15 64 USERS 65536 8192 SYSTEM
TEST16 40 TEST2 40960 8192 UNIFORM
####################################################################

实验三:一个表空间有10个数据文件,在此表空间中创建一个大小100M的表,表的空间将如何分配到10个数据文件
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn