天天看點

TableSpace介紹

簡介

  TableSpace是Oracle空間管理上的邏輯機關,實體上存放資料的是Tablespace裡面的檔案(Data File);而我們所熟悉的Table就放在這一個一個的檔案裡面。是以TableSpace可以看成是Data File的群組。通常在管理上會把使用者的資料與Oracle系統的對象以不同的Tablespace做切分。如果一個Oracle上有多個不同的AP系統,以不同的TableSpace做切割,則可以達到管理與備份的目的。但是TableSpace的功用也不僅僅隻是簡單的群組分類而已,Oracle提供了許多功能上的參數來設定TableSpace來達到空間管理與效能增進的目的。

  有必要提的是,TableSpace沒辦法跨資料庫,TableSpace中的Data File沒辦法跨TableSpace,Data File中的Table (Segement)可以跨Data File,但不能跨TableSpace。簡單的來說,一個Table裡面的資料是有可能因為Oracle的空間配置設定而分布在同一個TableSpace的不同的Data File中的;是以一個Data File創出來後,是不能随便删除的,這将會造成嚴重的資料損毀的問題。

SYSTEM與Non-SYSTEM TableSpace

  當資料庫剛建立起來,系統會建立一個叫做SYSTEM的系統TableSpace,存放SYS、SYSTEM等User重要的系統資料(ex:資料字典與預儲程式等)如果我們建立Oracle User時,不指定預設的TableSpace,則此User則會以SYSTEM TableSpace作為預設的TableSpace。這将造成管理上的混亂與嚴重的效能問題,這是必須特别注意的。

TableSpace的類型:Permanent、Undo、Temporary

§ Permanent Tablespace

  一般我們建立給AP使用的都是Permanent Tablespace。裡面對象的生命周期不會随着交易或者使用者的session結束而消失。

§ 

§ Undo Tablespace

  Undo Tablespace是系統用的特殊的Tablespace,用來取代過去的rollback segement的機制,主要的功用是提供使用者修改資料未commit之前的read consistency的功能以及rollback交易的功能。也因為undo tablespace主要是取代過去的rollback segement的機制,是以不能存放其他種類的segement。undo tablespace隻能是local managed。

§ 

§ Temporary Tablespace

  Temporary Tablespace也是系統用的特殊的Tablespace。當使用者需要做排序時,有時就會使用Temporary Tablespace,是以裡面的Segement的生命周期都很短,可能交易結束或者User的Session結束就會消失。每個系統都必須要有一個預設的Temporary Tablespace(Default Temporary Tablespace),如果沒有的話,忘了指定使用哪個Temporary Tablespace的使用者會以SYSTEM tablespace來當作Temporary Tablespace,這樣就很糟糕。以下列出幾個Temporary Tablespace的特性。

1.    Temporary Tablespace是NOLOGGING模式,是以若資料庫損毀,做Recovery不需要恢複Temporary Tablespace。

2.    Temporary最好是使用Local managed Tablespace

3.    若使用local managed模式,UNIFORM. SIZE參數最好是Sort_Area_Size的參數,這樣效能比較好。

4.    Uniform. size預設1024K,而Sort_area_size預設是512K

5.    Temporary Tablespace不能使用local managed的AUTOALLOCATE參數。

TableSpace的Extent空間管理:Local Managed與Dictionary Managed

  Local Managed與Dictionary Managed最主要的分别,在于空間管理方式的不同。Local managed的管理方式是讓每個TableSpace自己利用bitmaps去管理他自己的空間,而Dictionary Managed則是利用SYSTEM TableSpace的資料字典來做空間管理。這兩者最大的不同在于Local managed大大的改善了Oracle做空間管理(例如:産生新的Exten或釋放Extent...等)時,搶奪SYSTEM TableSpace資源的問題。是以Oracle從8i以後已經朝Local managed的方向去走了,是以我們應該盡量使用Local managed的方式才對,是以Dictionary managed的方式不多做介紹了。

§ Local managed tablespace

1.    Local managed使用bitmaps做空間管理。

2.    bitmaps中每個bit代表一個data block或者一堆相鄰的data block(extent)

3.    從10g開始,SYSTEM Tablespace預設使用local managed-->Oracle建議使用local managed的證據。

4.    假如SYSTEM TableSpace是local managed,那麼其他TableSpace必須是local managed。

5.    若沒指定使用local managed或者dictionary managed,則預設使用local managed。

6.    使用local managed可以增進效能,因為減少了SYSTEM TableSpace的效能競争。

7.    使用local managed則不需要做空間縫合(loalescing),因為相鄰的不同大小的extent,辨識extent使用狀态的bits也在一起,Oracle可以直接使用這些相鄰的extent。不需要先進行縫合才可以使用。這也可以增進部份效能。

§ local managed的extent空間管理(Extent Management):AUTOALLOCATE與UNIFORM

  AUTOALLOCATE與UNIFORM這兩個參數,是用來設定Local managed的extent大小的參數。AUTOALLOCATE是讓Oracle自己來決定extent的大小;而UNIFORM則是強制規定TableSpace中extent的為固定的大小。通常若你明确的知道extent必須多大,才會使用UNIFORM,使用UNIFORM的好處是每個extent的大小都相同,不會産生空間破碎的問題。但是如果無法預知extent必須多大,使用AUTOALLOCATE會比較好,讓Oracle自己決定使用extent的大小,可以比較符合實際的需求,是以會比較節省空間,但是這可能會産生部分空間破碎的問題。使用AUTOEXTENT,Oracle會使用的extent大小為64k、1M、8M、64M。根據我系統上使用的結果,99.95%的extent都是使用64k、隻有少部分使用1M的extent,是以其實破碎的情況不嚴重,使用AUTOALLOCATE在我的系統上其實就夠用了。想知道你的TableSpace所使用的Extent有幾種,請用下列的文法:

Select bytes,count(*) from dba_extents where tablespace_name='your_tablespace_name' group by bytes

§ 

§ Local managed中的Segment的空間管理(Segment Space Management ):AUTO與MANUAL

  Tablespace中的Segment的空間管理上,可以設定的參數為AUTO與MANUAL。MANUAL是使用我們熟悉的PCTUSED、FREELISTS、FREELIST GROUPS的方式來管理Segment中的data block;而AUTO則是使用bitmaps來管理data block。使用AUTO來管理的話,以往create tablespace或create table時設定的storage的參數設定都不需要再設定了,因為data block的管理已經是bitmaps了,不再是free list了。如果沒有特别的需求話,使用AUTO會比使用MANUAL有更好的空間使用率,與效能上的提升。

§ 

§ Local managed中的Create TableSpace範例

Create Tablespace MYDATA

Datafile '/u1/oradata/mydb/mydata1.dbf' size 100M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED ,

          '/u1/oradata/mydb/mydata2.dbf' size 100M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED

Extent ManagementLocal

Segment Space ManagementAuto;

§ 

§ dictionary managed中的Create TableSpace範例

Create Tablespace MYDATA

Datafile '/u1/oradata/mydb/mydata1.dbf' size 100M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED

Extent ManagementDictionary

Default Storage(

Initial 64k

next 64k

minextents 2

maxextents unlimited

pctincrease 0 );