LMT下extent的分配

space6212發表於2019-05-25

如果表空間存在多個資料檔案,那麼extent在擴充套件的時候是如何決定在那個extent檔案分配空間的呢?


下面做一個試驗來說明這個問題:
本實驗以本地管理的表空間為例。

--建立系統管理的本地表空間
SQL> create tablespace tbs_system datafile 'E:ORACLEORADATAORACLE9Itbs_system01.dbf' size 2112k,'E:ORACLEORADATAORACLE9Itbs_system02.dbf' size 2112k,'E:ORACLEORADATAORACLE9Itbs_system03.dbf' size 2112k,'E:ORACLEORADATAORACLE9Itbs_system04.dbf' size 2112k;

Tablespace created

--建立統一尺寸的本地表空間
SQL> create tablespace tbs_uniform datafile 'E:ORACLEORADATAORACLE9Itbs_uniform01.dbf' size 2112k,'E:ORACLEORADATAORACLE9Itbs_uniform02.dbf' size 2112k,'E:ORACLEORADATAORACLE9Itbs_uniform03.dbf' size 2112k,'E:ORACLEORADATAORACLE9Itbs_uniform04.dbf' size 2112k uniform size 64k;

Tablespace created

--建立一個基於系統管理表空間的表
SQL> create table t_system tablespace tbs_system as select * from item where rownum<15000;

Table created

SQL> select extent_id,blocks ,file_id from dba_extents where segment_name='T_SYSTEM';

EXTENT_ID BLOCKS FILE_ID
---------- ---------- ----------
0 8 10
1 8 10
2 8 10
3 8 10
4 8 10
5 8 10
6 8 10
7 8 10
8 8 10
9 8 10
10 8 10
11 8 10
12 8 10
13 8 10
14 8 10
15 8 10
16 128 11
17 128 12
18 128 13
19 128 10

EXTENT_ID BLOCKS FILE_ID
---------- ---------- ----------
20 128 11
21 128 12

22 rows selected

--從查詢結果可以看出,在前16個extent前(每個extent大小是64k),extent都在同一個資料檔案中;從17個extent(1m)開始,extent在同一個表空間的資料檔案中迴圈分配。

--建立基於統一尺寸本地表空間的表
SQL> create table t_uniform tablespace tbs_uniform as select * from item where rownum<15000;

Table created

SQL> select extent_id,blocks ,file_id from dba_extents where segment_name='T_UNIFORM';

EXTENT_ID BLOCKS FILE_ID
---------- ---------- ----------
0 8 14
1 8 15
2 8 16
3 8 17
4 8 14
5 8 15
6 8 16
7 8 17
8 8 14
9 8 15
10 8 16
11 8 17
12 8 14
13 8 15
14 8 16
15 8 17
16 8 14
17 8 15
18 8 16
19 8 17

EXTENT_ID BLOCKS FILE_ID
---------- ---------- ----------
20 8 14
21 8 15
22 8 16
23 8 17
24 8 14
25 8 15
26 8 16
27 8 17
28 8 14
29 8 15
30 8 16
31 8 17
32 8 14
33 8 15
34 8 16
35 8 17
36 8 14
37 8 15
38 8 16
39 8 17
40 8 14
--從以上查詢結果可以看出,在統一尺寸的表空間下,extent從一開始就在同一表空間下的各個資料檔案中迴圈擴充套件。

經過測試,在DMT下,oracle在資料檔案中擴充套件extent時也是趨於迴圈的。
我們可以利用oracle的這一特性,不用分割槽、不用在作業系統級做條帶化,只需要在建立表空間時多新增幾個資料檔案(各個資料檔案位於不同的磁碟中),就可以實現簡單的條帶化。

總結:
如果一個表空間存在多個資料檔案,且多個資料檔案都有可用的空間,則
1、如果是系統管理的本地表空間,為了使所有小區在一起,以避免在需要檔案中分配大量小區而導致在刪除物件時而產生的碎片,oracle會把物件的前16個extent(64k)都分配在同一個資料檔案中;從第17個extent開始才迴圈在同一個表空間的各個資料檔案中擴充套件。
2、如果是統一尺寸的本地管理表空間,則不用擔心碎片問題,extent從一開始就在多個資料檔案中迴圈分配。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-63747/,如需轉載,請註明出處,否則將追究法律責任。

相關文章