程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> 關於Oracle數據庫 >> ORACLE空間管理實驗2:區的管理與分配

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

編輯:關於Oracle數據庫

      內容基於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

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved