ORACLE空間管理實驗2:區的管理與分配

還不算暈發表於2014-01-27
內容基於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個資料檔案

將會平均分配到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


相關文章