內容基於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個數據文件中。下面我建一個表空間包含四個數據文件,建一個表,初始化大小為20M,將平均分配到這4個數據文件中。
BYS@ bys3>select a.tablespace_name,a.file_id,b.file_name,a.bytes/1024/1024 file_byte_mb from dba_free_space a,dba_data_files b where a.file_id=b.file_id and a.tablespace_name='TEST2';
TABLESPACE_NAME FILE_ID FILE_NAME FILE_BYTE_MB
------------------------------ ---------- ---------------------------------------- ------------
TEST2 7 /u01/oradata/bys3/test2.dbf 9.8828125
TEST2 8 /u01/oradata/bys3/test2_2.dbf 9.921875
TEST2 9 /u01/oradata/bys3/test2_3.dbf 9.921875
TEST2 10 /u01/oradata/bys3/test2_4.dbf 9.921875
BYS@ bys3>drop table test16 purge;
Table dropped.
BYS@ bys3>drop table test17 purge;
Table dropped.
BYS@ bys3>create table test17(aa int) tablespace test2 storage (initial 20m);
Table created.
BYS@ bys3>insert into test17 values(888);
1 row created.
BYS@ bys3>commit;
Commit complete.
col file_name for a30
col tablespace_name for a15
select a.tablespace_name,a.file_id,b.file_name,a.bytes/1024/1024 file_byte_mb from dba_free_space a,dba_data_files b where a.file_id=b.file_id and a.tablespace_name='TEST2';
TABLESPACE_NAME FILE_ID FILE_NAME FILE_BYTE_MB
------------------------------ ---------- ---------------------------------------- ------------
TEST2 7 /u01/oradata/bys3/test2.dbf 4.921875
TEST2 8 /u01/oradata/bys3/test2_2.dbf 4.921875
TEST2 9 /u01/oradata/bys3/test2_3.dbf 4.921875
TEST2 10 /u01/oradata/bys3/test2_4.dbf 4.921875
實驗使用中應該保持數據文件大小一致。如表空間有三個數據文件,大小分別是9M,19M,9M,在分配3M的空間時,會在每個數據文件中各分配1M。
一直到兩個9M的數據文件空間用完,再分配時,則從剩余的一個數據文件中分配。見實驗:
BYS@ bys3>select a.tablespace_name,a.file_id,b.file_name,a.bytes/1024/1024 file_byte_mb from dba_free_space a,dba_data_files b where a.file_id=b.file_id and a.tablespace_name='TEST3';
TABLESPACE_NAME FILE_ID FILE_NAME FILE_BYTE_MB
--------------- ---------- ------------------------------ ------------
TEST3 11 /u01/oradata/bys3/test3_1.dbf 9
TEST3 12 /u01/oradata/bys3/test3_2.dbf 19
TEST3 13 /u01/oradata/bys3/test3_3.dbf 9
BYS@ bys3>insert into test1 values(789999);
1 row created.
BYS@ bys3>commit;
Commit complete.
BYS@ bys3>select a.tablespace_name,a.file_id,b.file_name,a.bytes/1024/1024 file_byte_mb from dba_free_space a,dba_data_files b where a.file_id=b.file_id and a.tablespace_name='TEST3';
TABLESPACE_NAME FILE_ID FILE_NAME FILE_BYTE_MB
--------------- ---------- ------------------------------ ------------
TEST3 11 /u01/oradata/bys3/test3_1.dbf 1
TEST3 12 /u01/oradata/bys3/test3_2.dbf 11
TEST3 13 /u01/oradata/bys3/test3_3.dbf 1
BYS@ bys3>create table test2(aa int) tablespace test3 storage (initial 5m);
Table created.
BYS@ bys3>insert into test2 values(789999);
1 row created.
BYS@ bys3>commit;
Commit complete.
BYS@ bys3>select a.tablespace_name,a.file_id,b.file_name,a.bytes/1024/1024 file_byte_mb from dba_free_space a,dba_data_files b where a.file_id=b.file_id and a.tablespace_name='TEST3';
TABLESPACE_NAME FILE_ID FILE_NAME FILE_BYTE_MB
--------------- ---------- ------------------------------ ------------
TEST3 12 /u01/oradata/bys3/test3_2.dbf 8