本地管理和字典管理-表空間
本地管理表空間:
1.可以提高儲存分配操作的速度
2.能夠避免在表空間的儲存管理操作中產生的遞迴現象
3.不會產生重做和撤銷記錄
4.簡化管理操作
字典管理表空間:
各個區的資訊都儲存在資料字典中
由字典管理轉化為本地管理:execute DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL ('USERS');
本地治理表空間與字典治理表空間相比大大提高了治理效率和資料庫效能,其優點如下:
1.減少了遞迴空間治理
本地治理表空間是自己治理分配,而不是象字典治理表空間需要系統來治理空間分配,本地表空間是通過在表空間的每個資料檔案中維持一個位圖來跟蹤在此檔案中塊的剩餘空間及使用情況。並及時做更新。這種更新只對表空間的額度情況做修改而不對其他資料字典表做任何update操作,所以不會產生任何回退資訊,從而大大減少了空間治理,提高了治理效率。同時由於本地治理表空間可以採用統一大小分配方式(UNIFORM),因此也大大減小了空間治理,提高了資料庫效能。
2.系統自動治理extents大小或採用統一extents大小
本地治理表空間有自動分配(AUTOALLOCATE)和統一大小分配(UNIFORM)兩種空間分配方式,自動分配方式(AUTOALLOCATE)是由系統來自動決定extents大小,而統一大小分配(UNIFORM)則是由使用者指定extents大小。這兩種分配方式都提高了空間治理效率。
3.減少了資料字典之間的競爭
因為本地治理表空間通過維持每個資料檔案的一個位圖來跟蹤在此檔案中塊的空間情況並做更新,這種更新只修改表空間的額度情況,而不涉及到其他資料字典表,從而大大減少了資料字典表之間的競爭,提高了資料庫效能。
4.不產生回退資訊
因為本地治理表空間的空間治理除對錶空間的額度情況做更新之外不修改其它任何資料字典表,因此不產生回退資訊,從而大大提高了資料庫的執行速度。
5.不需合併相鄰的剩餘空間
因為本地治理表空間的extents空間治理會自動跟蹤相鄰的剩餘空間並由系統自動治理,因而不需要去合併相鄰的剩餘空間。同時,本地治理表空間的所有extents還可以具有相同的大小,從而也減少了空間碎片。
6.減少了空間碎片
7.對臨時表空間提供了更好的治理
二、名詞解釋與約定
表空間(Tablespace)——為資料庫提供使用空間的邏輯結構,其對應物理結構是資料檔案,一個表空間可以包含多個數據檔案。
本地管理表空間(Locally Managed Tablespace簡稱LMT)——8i以後出現的一種新的表空間的管理模式,通過本地點陣圖來管理表空間的空間使用。
字典管理表空間(Dictionary-Managed Tablespace簡稱DMT)——8i以前包括以後都還可以使用的一種表空間管理模式,通過資料字典管理表空間的空間使用。
段(Segment)——資料庫一種邏輯結構,如表段,索引段,回滾段等,段存在於表空間中,並對應一定的儲存空間。
區(Extent)——段的儲存可以分成一個或多個區間,每個區間佔用一定數量的資料塊(block),在本地管理的表空間中,表空間的Extent就對應段的Extent。
塊(Block)——資料庫最小的儲存單位,在本文中Block的大小約定為8192位元組。
位(Bit)——本地管理表空間的空間管理單位,一個位可能等於一個區間,也可能多個位組成一個區間。
三、本地管理表空間的由來
在Oracle8I的版本中,Oracle推出了一種全新的表空間管理方式:本地化管理的表空間。所謂本地化管理,就是指Oracle不再利用資料字典表
來記錄Oracle表空間裡面的區的使用狀況,而是在每個表空間的資料檔案的頭部加入了一個位圖區,在其中記錄每個區的使用狀況。每當一個
區被使用,或者被釋放以供重新使用時,Oracle都會更新資料檔案頭部的這個記錄,反映這個變化。本地化管理的表空間的建立過程:
語法:CREATE TABLESPACE 表空間名字
DATAFILE '資料檔案詳細資訊'
[EXTENT MANAGEMENT { LOCAL
{AUTOALLOCATE | UNIFORM [SIZE INTETER [K|M] ] } } ]
關鍵字EXTENT MANAGEMENT LOCAL 指定這是一個本地化管理的表空間。對於系統表空間,只能在建立資料庫的時候指定EXTENT MANGEMENT LOCAL,因為它是資料庫建立時建立的第一個表空間。
在8i中,字典管理還是預設的管理方式,當選擇了LOCAL關鍵字,即表明這是一個本地管理的表空間。當然還可以繼續選擇更細的管理方式:是 AUTOALLOCATE 還是 UNIFORM.。若為AUTOALLOCATE,則表明讓Oracle來決定區塊的使用辦法;若選擇了UNIFORM,則還可以詳細指定每個區塊的大小,若不加指定,則為每個區使用1M大小。
Oracle之所以推出了這種新的表空間管理方法,讓我們來看一下這種表空間組織方法的優點:
1. 本地化管理的表空間避免了遞迴的空間管理操作。而這種情況在資料字典管理的表空間是經常出現的,當表空間裡的區的使用狀況發生改變時,資料字典的表的資訊發生改變,從而同時也使用了在系統表空間裡的回滾段。
2. 本地化管理的表空間避免了在資料字典相應表裡面寫入空閒空間、已使用空間的資訊,從而減少了資料字典表的競爭,提高了空間管理的併發性。
3. 區的本地化管理自動跟蹤表空間裡的空閒塊,減少了手工合併自由空間的需要。
4. 表空間裡的區的大小可以選擇由Oracle系統來決定,或者由資料庫管理員指定一個統一的大小,避免了字典表空間一直頭疼的碎片問題。
5. 從由資料字典來管理空閒塊改為由資料檔案的頭部記錄來管理空閒塊,這樣避免產生回滾資訊,不再使用系統表空間裡的回滾段。因為由數
據字典來管理的話,它會把相關資訊記在資料字典的表裡,從而產生回滾資訊。
由於這種表空間的以上特性,所以它支援在一個表空間裡邊進行更多的併發操作,並減少了對資料字典的依賴。
四、本地管理表空間管理機制
表空間是一種為段(表,索引等)提供空間的邏輯結構,所以,當在表空間中增加,刪除段的時候,資料庫就必須跟蹤這些空間的使用。
如下例所示,假定一個新建立的表空間包含了五個表
表一……表二……表三……表四……表五……未用空間
當我們刪除表四的時候,就有如下結果
表一……表二……表三……空閒空間段……表五……未用空間
很明顯,ORACLE需要有一個機制來管理表空間中各資料檔案的這些分配的或未分配的空間,為了跟蹤這些可以使用的空間(包括未分配使用的和可以重複使用的),對於每一個空間,我們必須知道:
1、這個可用空間位於什麼資料檔案
2、這個空間的尺寸是多大
3、如果它在用了,是哪一個段佔用的這個空間
直到8i之前,所有的表空間都是採用字典管理模式,為了確保能儲存以上的資訊,ORACLE用了兩個資料字典表:UET$(已使用的區間)或FET$(
空閒空間):
SQL> desc UET$
Name Null? Type
----------------- ----------- -----------
SEGFILE# NOT NULL NUMBER
SEGBLOCK# NOT NULL NUMBER | The segment that uses this space
EXT# NOT NULL NUMBER
TS# NOT NULL NUMBER | The tablespace ID and the file
FILE# NOT NULL NUMBER | ID for that tablespace
BLOCK# NOT NULL NUMBER
LENGTH NOT NULL NUMBER | The location and size of the chunk
SQL> desc FET$
Name Null? Type
----------------- ----------- -----------
TS# NOT NULL NUMBER | The tablespace ID and the file
FILE# NOT NULL NUMBER | ID for that tablespace
BLOCK# NOT NULL NUMBER
LENGTH NOT NULL NUMBER | The location and size of the chunk
查詢該表可以看到,每個使用空間或空閒空間(不一定是一個extent,可以是多個extent)都在該表中對應了一行。它的工作方式是當一個段被刪除的時候,ORACLE就移動UET$中相應的行到FET$,這個過程的發生是連續的,而且可能發生等待。當併發性很高的時候,資料字典的爭用
就來了。另外有一個問題就是,當表的空間很不連續或表空間有大量的碎片引起這兩個表的增大,那麼也就會引起資料庫效能上的下降。
本地管理表空間正是為了解決這一問題來的,在表空間的空間管理上,ORACLE將儲存資訊儲存在表空間的頭部的點陣圖中,而不是儲存在資料字典中。通過這樣的方式,在分配回收空間的時候,表空間就可以獨立的完成操作也不用與其它物件關係。
下面就讓我們進入到本地管理表空間的內部,看看ORACLE是怎麼實現這一工作的。
Uniform方式的本地管理表空間
1、 先建立了一個本地管理的表空間,區間統一大小分配為64K
SQL> create tablespace demo
datafile '/ora01/oem/oemdemo01.dbf' size 10m
extent management local uniform size 64k;
2、 在該表空間中建立一個表
SQL>create table demotab ( x number ) tablespace demo
storage ( initial 1000K next 1000k );
我們通過查詢該表
SQL> select t.table_name,t.initial_extent,t.next_extent from user_tables t where t.table_name = 'DEMOTAB';
TABLE_NAME INITIAL_EXTENT NEXT_EXTENT
------------------------------ -------------- -----------
DEMOTAB 1024000 65536
可以發現,該表的儲存引數並不是我們指定的引數INITIAL_EXTENT,而是uniform size的整數倍,NEXT_EXTENT則等於uniform size。我們從該查詢就也可以看到如下情況
SQL>select count(*) from user_extents where segment_name = 'DEMOTAB';
COUNT(*)
----------
16
也就是說,該表在該表空間中已經存在16個extent,而不是一個extent(這是與字典管理的差別,如果是字典管理的表空間,如果建立以上的表,該查詢的結果是1)。
3、 獲取該資料檔案的檔案ID
SQL> col name format a30 trunc
SQL> select file#, name from v$datafile;
File# NAME
----- --------------------
1 /oras1/oem/oemsystem01.dbf
2 /oras3/oem/oemundo01.dbf
3 /ora01/oem/oemoem_repository01
4 /ora01/oem/oemrcat01.dbf
5 /ora01/oem/oemdemo01.dbf
我們可以檢查uet$與fet$
SQL> select count(*) from uet$ where file# = 5;
COUNT(*)
----------
0
SQL> select count(*) from fet$ where file# = 5;
COUNT(*)