oracle 表空間管理


  CREATE TABLESPACE RMANXL_DATA DATAFILE 

  '+DAT1_ASM' SIZE 240M AUTOEXTEND ON NEXT 10M MAXSIZE 1900M

  LOGGING

  ONLINE

  EXTENT MANAGEMENT LOCAL AUTOALLOCATE

  BLOCKSIZE 8K

  SEGMENT SPACE MANAGEMENT AUTO

  FLASHBACK ON;

}


表空間是ORACLE數據庫最高層次的邏輯存儲結構,保存段、區、塊,由一個或多個數據文件組成。
塊的存儲管理


塊是ORACLE存儲結構的最小單位。塊大小分爲標準數據塊和非標準數據塊
標準數據塊由DB_BLOCK_SIZE設定,創建數據庫時設定的,創建完數據庫後不能修改。
非標準塊可以有4種,由初始化參數DB_nk_CACHE_SIZE設置,可在數據庫創建後使用。
數據塊的管理方法分爲
1、自動管理方式  如創建表空間時設置爲本地管理方式,並且將段的存儲空間方式設置爲AUTO,該表空間的所有塊均採用自動管理方式。系統默認值。
2、手工管理方式  是傳統的管理方式,主要通過PCTFREE和PCTUSED兩個存儲參數控制可用存儲區的大小,避免行遷移現象的發生。這兩個參數可在創建表空間時設置,也可在數據庫的模式對象(表,索引)中設置。模式對象中設置的優先級比表空間的要高。如表和索引中沒有設置,則按表空間的設置,如表空間也沒設置,則按自動管理方式管理塊。


區的存儲管理
區是ORACLE進行存儲空間分配的最小單位。是由一系列物理上連續的數據塊組成的邏輯存儲結構。段中第一個區叫初始區,隨後分配的區叫後續區。當段中所有的空間使用完後,ORACLE自動爲該段分配一個新的區
根據表空間的管理方法不同,區的分配方法也不同。
(1)本地管理方式下的區的分配方法。
自動分配和統一分配
自動分配由ORACLE自動確定段中初始區大小,默認值爲64K,並根據存儲要求自動分配優化大小的後續區
統一分配由ORACLE自動分配具有統一大小的初始區和後續區

CREATE TABLESPACE lmtbsb 

DATAFILE '/u02/oracle/data/lmtbsb01.dbf' SIZE 50M

EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

 

CREATE TABLESPACE lmtbsb DATAFILE '/u02/oracle/data/lmtbsb01.dbf' SIZE 50M

EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;

(2)字典管理方式下的區的分配方法。
根據存儲子句STORAGE中的存儲參數分配新的區。
storage (
initial  integer [K|M]
next  integer [K|M]
minextents integer
maxextents  {integer | unlimited}
pctincrease integer
)
如果使用了DEFAULT STORAGE子句,至少需要在其中設置一個存儲參數。
INITIAL。缺少5個數據塊的大小。如該值不是數據塊大小的整數倍,系統自動確定舍入到數據塊大小的整數倍。
PCTINCREASE。缺少爲50。回滾段不能指定此參數,其值總是0。
存儲子句可以在3處設置:
一是ORACLE缺省值
二是創建表空間時爲表空間設置的存儲參數
三是創建模式對象(如表、索引)時爲該模式對象設置的存儲參數。
這三個地方都可能對區的分配產生影響,有優先級
創建模式對象中的存儲子句最高,表空間次之,ORACLE缺省值最低。
也就是說創建模式對象時沒有指定存儲參數,按表空間的存儲子句進行,如表空間沒有指定,按ORACLE缺省值來。
區分配管理在創建表空間時確定,建完後,不允許更改
extent management
{dictionary |
local autoallocate | uniform [size integer K|M] }
autoallocate  本地管理方式下的區自動分配
uniform     本地管理方式下的區統一分配

段的存儲管理

一個段只屬於一個模式對象,如表、索引
創建一個模式對象時,ORACLE爲這個對象創建一個段,在這個段中保存這個對象的所有數據,當這個段數據增加時,爲這個段分配新的區存儲數據。段中至少有一個初始區。
段有以下類型:
數據段   用來存儲表和簇的數據
索引段
臨時段   暫存SQL語句的臨時數據,以及臨時表和臨時表的索引等。
回退段
段管理主要有兩種方式:
自動管理方式。 採用位圖管理段的存儲空間
手工管理方式。 採用FREELIST管理段的存儲空間
段的管理方式只有在創建表空間時設置,完成後不好更改
在ORACLE9I中,缺省狀態爲自動管理方式
segment space management { man l | auto}


表空間
表空間的管理方式主要有兩種:
字典管理  在數據字典中管理表空間的空間分配
本地管理  在每個數據文件中使用位圖來管理空間的分配,表空間中所有區的分配信息都保存在該表空間對應的數據文件的頭部。

oracle 8i以前只有字典管理,之後引入本地管理
本地管理的表空間的優點
速度快,存儲空間的分配和回收只是簡單地改變數據文件中的位圖,而不像字典管理方式還需要修改數據庫。
改善了存儲管理的性能。某些在字典管理方式下的存儲分配有時會產生遞歸操作,從而影響了系統的性能,使用本地管理方式不會產生遞歸操作。而且無碎片,更易於DBA維護。
段的管理方式是在建立表空間時確定的,一經確定不能改變。
區的管理方式與表空間的管理方式密切相關:
字典方式下:ORACLE根據存儲子句分配區,這些參數可以在創建表空間後修改。參數設置不恰當,表空間中會有空閒區碎片,需要DBA手工執行碎片合併,降低性能,增加DBA工作。
本地方式下:由ORACLE自動分配區,這種方式一旦確定不能修改。ORACLE9I 建議採用方式。
表空間的類型:
System Tablespace 系統表空間:主要包括數據字典、所有PL/SQL程序單元以及所有模式對象的定義。
Temp Tablespace  臨時表空間:用於暫存一些複雜SQL查詢語句運行時產生的臨時數據。在執行SQL語句中,如臨時數據量大,SQL工作區放不下,將利用臨時表空間暫存部分臨時數據。
Undo Tablespace  :由ORACLE自動分配管理,每一個實例只能使用一個UNDO表空間
User Tablespace  用戶表空間:用來保存用戶數據


表空間的管理原則:
1、創建多個表空間
2 、將數據字典與用戶數據分別存放在不同的表空間中,避免同時訪問一個表空間產生訪問衝突
3、將不同應用的數據存放在不同的表空間,保證各類應用數據的獨立性。避免由於一個表空間脫機,導致多   個應用程序受到影響。
4、將不同表空間放在不同的硬盤上,均衡磁盤I/0操作。
5、將UNDO數據與用戶數據分別存儲,防止由於硬盤損壞導致數據永久丟失。
6、當一些表空間聯機時,可以將另外的表空間設爲脫機,提高數據庫性能。
7、爲某種特殊用途專門設置一個表空間,比如頻繁的更新操作,或者臨時段的存儲。專門設置的表空間可以優化表空間的使用效率。
由於某些操作系統對一個進程可以同時打開的系統文件數據具有限制,從而影響同時聯機的表空間數量,儘量讓表空間使用較少的數據文件。因此在創建表空間時,應當爲表空間分配足夠大的數據文件,或將數據文件設置爲自動增長方式,而不要讓一個表空間使用很多較小的數據文件。
2、設置表空間的默認存儲參數
創建字典管理方式的表空間時,可以設置表空間的默認存儲參數
3、爲用戶設置表空間限額
創建表空間:
CREATE [UNDO] TABLESPACE tablespace
[DATAFILE clause]
[MINIMUM EXTENT integer[K|M]]
[BLOCKSIZE integer [K]]
[LOGGING|NOLOGGING]
[DEFAULT storage_clause ]
[ONLINE|OFFLINE]
[PERMANENT|TEMPORARY]
[extent_management_clause]
[segment_management_clause]
在表空間創建過程中,ORACLE將在數據字典和控制文件中記錄下新建了一個表空間,同時創建指定大小的數據文件
所有表空間的數據文件總和不能超過初始化參數MAXDATAFILES的限制。
表空間創建好之後,可以使用:
alter tablespace
alter database   來修改表空間
默認情況下,創建的表空間具有標準塊大小,由初始化參數DB_BLOCK_SIZE指定
創建非標準塊大小的表空間,須在DB_nk_CACHE_SIZE中設置非標準塊的大小,系統纔在SGA區中創建具有相同大小的緩存區,否則該表空間將無法使用。
本地管理表空間中指定區的分配管理方式。
AUTOALLOCATE 和UNIFORM 兩種
默認是AUTOALLOCATE,常用於需要存放大小經常變化的對象和使用不同大小區的表空間,雖然可能造成一些存儲空間的浪費,可減輕DBA工作量。
create tablespace user02
datafile ‘d:/user02.dbf’ size 5M
extent management local autoallocate;
UNIFORM方式常用於存放的大部分對象都要求使用相同大小區的表空間。不會產生任何存儲碎片,可以避免存儲空間的浪費。
create tablespace user02
datafile ‘d:/user02.dbf’ size 5M
extent management local uniform size 128k;
如沒有指定SIZE參數的值,將使用1M作爲默認值。
本地管理的表空間分配的數據文件,其頭部的部分空間用於空間管理,用UNIFORM方式創建本地管理表空間,爲表空間分配的數據文件大小應該大於UNIFORM之後的SIZE指定的區的大小。
本地管理表空間中指定段的存儲管理方式。
MAN L 和AUTO兩種
MAN L方式使用FREELIST來管理段中間的空閒數據塊,默認方式
create tablespace user02
datafile ‘d:/user02.dbf’ size 5M
extent management local 
segment space management man l;
AUTO方式使用位圖來管理段中已用數據塊和空閒數據塊。
create tablespace user02
datafile ‘d:/user02.dbf’ size 5M
extent management local 
segment space management auto;
應用於以後所有在該表空間中創建的段,並且段存儲管理方式不能改變。
創建字典管理的表空間
通過存儲子句(storage)設置存儲參數對區進行存儲管理,其特點是存儲管理具有很強的靈活性,但是存儲空間空間會產生碎片,需要手工回收合併。
段的管理方式與本地管理的表空間一樣,既可以採用MAN L,也可以採用AUTO方式。
create tablespace user06
datafile 'd:/user06.dbf' size 5M
extent management dictionary
defa




##########################################



字典管理表空間-DMT     本地管理表空間-LMT

字典管理表空間(Dictionary-Managed Tablespace簡稱DMT),8i以前包括以後都還可以使用的一種表空間管理模式,通過數據字典管理表空間的空間使用。

Oracle使用兩個字典來記錄Extents的使用情況:SYS.FET$記錄空閒的Extents,SYS.UET$記錄使用的Extents。在分配和釋放分區時,都要修改者兩個字典。屬於DML操作,存在競爭,每個動作都是一個事務,會產生UNDO記錄。需要週期性進行合併操作。效率低下

本地管理表空間(Locally Managed Tablespace簡稱LMT),8i以後出現的一種新的表空間的管理模式,通過位圖來管理表空間的空間使用。

通過數據頭文件中的一個位圖來記錄文件中表空間的使用情況,每個BIT代表數據區,通過改變bit值來表示Extents的分配使用或釋放,不屬於DML操作,也不會產生UNDO記錄,可以自動跟蹤連續的空閒空間。帶來的優勢:不需要使用字典SYS.FET$和SYS.UET$上的遞歸SQL調用;減少數據字典的競爭;不會產生UNDO記錄;不再需要週期性合併操作。

例:創建了一個本地管理的表空間,區間統一大小分配爲64K

SQL> create tablespace leonarding

datafile '/ora01/oem/ leonarding 01.dbf' size 100m

extent management localuniform. size 64k;

本地管理tablespace(LMT)——LMT是通過把EXTENT MANAGEMENT LOCAL子句添加到tablespace的定義句法而實現的。和原來由字典管理的tablespace(DMT)不同,LMT會將擴展管理自動化,並保持Oracle DBA不會被用來指定管理擴展大小的NEXT存儲參數。這個原則唯一的例外是在NEXT和MINEXTENTS一起用在表格創建的時候。

自動段空間管理(ASSM)——ASSM的tablespace是通過將SEGMENT SPACE MANAGEMENT AUTO子句添加到tablespace的定義句法裏而實現的。通過使用位圖freelist取代傳統單向的鏈接列表freelist,ASSM的tablespace會將freelist的管理自動化,並取消爲獨立的表格和索引指定PCTUSED、FREELISTS和FREELIST GROUPS存儲參數的能力。

自動段空間管理(ASSM)

更多精彩內容:http://www.bianceng.cn/database/Oracle/

在920以前,表的剩餘空間的管理與分配都是由連接列表freelist來完成的,因爲freelist存在串行的問題,因此容易引起段頭的爭用與空間的浪費(其實這一點並不明顯),最主要的還是因爲需要DBA花費大量的精力去管理這些爭用並監控表的空間利用。

自動段空間管理(ASSM),它首次出現在Oracle920裏。有了ASSM,連接列表freelist被位圖所取代,它是一個二進制的數組,能夠迅速有效地管理存儲擴展和剩餘區塊(free block),因此能夠改善分段存儲本質,ASSM表空間上創建的段還有另外一個稱呼叫Bitmap Managed Segments(BMB段)

Create tablespaceleonarding

datafile '/ora01/oem/leonarding01.dbf '

size 10m

EXTENT MANAGEMENT LOCAL-- Turn on LMT

SEGMENT SPACE MANAGEMENT AUTO-- Turn on ASSM;

一旦你定義好了tablespace,那麼表和索引就能夠使用各種方法很容易地被移動到新的tablespace裏,帶有ASSM的本地管理tablespace會略掉任何爲PCTUSED、NEXT和FREELISTS所指定的值。

當表格或者索引被分配到這個tablespace以後,用於獨立對象的PCTUSED的值會被忽略,而Oracle9i會使用位圖數組來自動地管理tablespace裏表格和索引的freelist。對於在LMT的tablespace內部創建的表格和索引而言,這個NEXT擴展子句是過時的,因爲由本地管理的tablespace會管理它們。但是,INITIAL參數仍然是需要的,因爲Oracle不可能提前知道初始表格加載的大小。對於ASSM而言,INITIAL最小的值是三個塊。

新的管理機制用位圖來跟蹤或管理每個分配到對象的塊,每個塊有多少剩餘空間根據位圖的狀態來確定,如>75%,50%-75%,25%-50%和<25%,也就是說位圖其實採用了四個狀態位來代替以前的pctused,什麼時候該利用該數據塊則由設定的pctfree來確定。

使用ASSM的一個巨大優勢是,位圖freelist肯定能夠減輕緩衝區忙等待(buffer busy wait)的負擔,這個問題在Oracle9i以前的版本里曾是一個嚴重的問題。

緩衝區不再忙等待

在沒有多個freelist的時候,每個Oracle表格和索引在表格的頭部都曾有一個數據塊,用來管理對象所使用的剩餘區塊,併爲任何SQL插入聲明所創建的新數據行提供數據塊。當數據緩衝內的數據塊由於被另一個DML事務處理鎖定而無法使用的時候,緩衝區忙等待就會發生。當你需要將多個任務插入到同一個表格裏的時候,這些任務就被強制等待,而同時Oracle會在同時分派剩餘的區塊,一次一個。

有了ASSM之後,Oracle宣稱顯著地提高了DML併發操作的性能,因爲(同一個)位圖的不同部分可以被同時使用,這樣就消除了尋找剩餘空間的串行化。根據Oracle的測試結果,使用位圖freelist會消除所有分段頭部(對資源)的爭奪,還能獲得超快的併發插入操作

ASSM的侷限性

儘管ASSM顯示出了令人激動的特性並能夠簡化Oracle DBA的工作,但是Oracle9i的位圖分段管理還是有一些侷限性的:

1.一旦DBA被分配之後,它就無法控制tablespace內部的獨立表格和索引的存儲行爲。

2.大型對象不能夠使用ASSM,而且必須爲包含有LOB數據類型的表格創建分離的tablespace。

3.你不能夠使用ASSM創建臨時的tablespace。這是由排序時臨時分段的短暫特性所決定的。

4.只有本地管理的tablespace才能夠使用位圖分段管理。

5.使用超高容量的DML(例如INSERT、UPDATE和DELETE等)的時候可能會出現性能上的問題。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章