11.管理物件空間(筆記)

tonykorn97發表於2006-04-15

11.管理物件空間


資料塊(oracle塊)是oracle在資料檔案上執行I/O操作的最小單位.

區是oracle進行空間分配的邏輯單位,它是由相鄰資料塊組成的.

段則用於儲存特定邏輯物件的所有資料.它是由一個或多個區組成的!



當建立表,索引和簇等物件時,oracle會為這些物件分配儲存空間,以存放他們的資料資訊,為這些物件所分配的儲存空間被稱為段.在一個表空間上可以包含一個或多個段,一個段只能存放在一個表空間上.

1,表段(Table)

表段用於儲存表的所有資料,其名稱與表名相同.建立表時,oracle會為該表建立相應的表段,並且表段只能存放在一個表空間中.

2,表分割槽段(Table Partition)

表分割槽段用於儲存分割槽表某個分割槽的資料.每個分割槽對應於一個表分割槽段.透過使用分割槽選項.可以將一張大表的資料部署到多個不同的分割槽段中,從而降低I/O次數,提供I/O效能.

3,簇段(Cluster)

簇段用於儲存簇表的資料,其名稱與簇名相同.簇用於邏輯組織相關表的資料,使用簇的目的時為了降低I/O次數,提高I/O效能.例如.如果經常執行主從表直接的連線查詢,可以將這兩張表的資料組織到簇中,一個簇可以包含一個或多個表,當將表組織到簇中時,其資料存放在簇段中,而不會為表分配專門的表段.假定在USERS表空間上建立簇ORD_ITEM_CLU,並且將表ORD和ITEM組織到簇中,此時只會分配簇段ORD_ITEM_CLU,而不會分配表段ORD和ITEM.

4,索引段(Index)

索引段用於儲存索引的資料,其名稱與索引名完全相同.當建立索引時,oracle會為索引建立相應的索引段,並且一個索引只能存放在一個表空間中.


5,索引分割槽段(Index Partition)

索引分割槽段用於儲存分割槽索引某個分割槽的資料,每個分割槽對應一個索引分割槽段..索引分割槽只能建立在分割槽表上,而不能建立在普通表上.

6,索引組織表段(Index_organized Table)

索引組織表時以B*-樹結構來組織表資料的.如果表資料經常需要引用主鍵列來檢索,可以考慮建立索引組織表,以加快訪問速度.一般情況下,表與索引資料分別存放在表段和索引段中.但是,如果建立索引組織表,表和其主鍵索引的資料會存放在索引段中,需要注意,當建立索引組織表時,必須定義主鍵列.

7,UNDO段.

UNDO段用於存放事務所修改資料的舊值.

8,臨時段(Temporary Segment)

臨時段用於存放排序操作所產生的臨時資料.


9,LOB段,

LOB段用於儲存LOB列的資料,如文獻,影像,音訊,影片等資料,建立表時,可以定義CLOB,BLOB或NCLOB型別的列,並且ORACLE會自動為這些列建立相應的LOB段,對於LOB列來說,如果資料長度低於4000位元組,該列和其他列的資料會以前存放在表段中,如果資料長度超過4000位元組,資料將會被存放到LOB段中.


10.LOB索引段

LOB索引段用於存放LOB索引的資料,定義LOB型別時,oracle不僅會為LOB列建立LOB段,還會建立LOB索引段,以加快LOB資料的檢索速度.

11.巢狀表段(Nested Table)

巢狀表段用於儲存巢狀表型別列的資料.巢狀表型別類似於高階語言中的物件資料型別.

該型別可以作為表列的資料型別使用.定義巢狀表列時,oracle會自動為改列分配巢狀表段,以存放該列的資料.

12,根引導段(Cache)

根引導段用於初始化資料字典快取記憶體,因此也被稱為Cache段,它時在建立資料庫時使用sql.bsq指令碼自動建立的,該段的維護由oralce自動完成.不需要DBA進行任何干預.

顯示段資訊

1,顯示段型別

SELECT distinct segment_type FROM dba_segments;

2,顯示段詳細資訊.

Col tablespace_name format a15

SELECT tablespace_name,extents,bytes

FROM dba_segment

WHERE owner=’scott’ AND segment_name=’EMP’;

其中,tablespace_name用於標識段所在表空間,extents用於標識段所包含的區個數,bytes用於標識段的尺寸,owner用於標識段的所有者,segment_name用於標識段名.

管理儲存引數

儲存引數

建立或修改資料物件時,透過指定儲存引數,可以設定區尺寸和區個數,對於字典管理表空間來說,區尺寸由儲存引數確定.對於本地管理表空間來說,如果在建立區域性表空間時指定了UNIFORM選項,那麼所有區尺寸完全相同,如果在建立區域性表空間時指定了AUTOALLOCATE選項,那麼區尺寸將由ORACLE SERVER自動分配.儲存引數既可以在段級定義,也可以在表空間級定義.其中段級具有最高的優先順序,表空間其次.如果在段級和表空間級都沒有指定儲存引數,那麼oracle會使用預設儲存引數.

1,INITIAL

對於字典管理表空間來說,INITIAL 用於指定為段所分配的第一個區的尺寸.對於本地管理表空間來說,如果MINEXTENTS等於1,資料庫會使用INITIAL和區尺寸確定段的初始尺寸.INITIAL只能在建立物件(CREATE TABLE,CREATE INDEX和CREATE CLUSTER)時設定.不能使用ALTER 語句進行修改.

2,NEXT

對於本地管理表空間來說,因為資料庫可以自動管理區,所以該引數沒有太大意義,對於字典管理表空間來說,NEXT用於指定為段所分配的第二個區的尺寸.

3,PCTINCREASE

對於字典管理表空間來說,PCTINCREASE用於指定從第三個區開始,每個區比前一個區所增長的百分比,取值為0~100.

4,MINEXTENTS

對於字典管理表空間來說,MINEXTENTS用於指定為段所分配的初始區的個數.

5,MAXEXTENTS

對於字典管理表空間來說,MAXEXTENTS用於指定段可以包含的最大區個數.

6.FREELIST GROUPS

FREELIST GROUPS用於指定物件的空閒列表組個數,每個空閒列表組都會佔用一個資料塊,oracle建議為Oracle Real Application Cluster的每個例程指定一個空閒列表.需要注意,FREELIST GROUPS只能在段級指定.

7,FREELISTS

FREELISTS用於指定每個空閒列表組上的空閒列表個數,空閒列表用於維護可插入資料的資料塊,注意,FREELISTS只能在段級指定.


在本地管理表空間上使用INITIAL引數.

當在本地管理表空間上建立資料物件時,透過使用INITIAL引數和區尺寸可以確定段的初始尺寸.假定在建立本地管理表空user01時指定UNIFORM選項,並且區尺寸為128k,以建立t1為例,說明確定段初始尺寸的方法.

CREATE TABLES t1(cola INT) TABLESPACE user01

STORAGE(INITIAL 500K);

TABLESPACE選項用於指定段所在表空間,STORAGE用於指定段的儲存引數,INITIAL用於指定段的初始尺寸,因為區尺寸為500k,而該值不能整除128k,因此段的初始尺寸實際為512k.


在字典管理表空間上使用儲存引數.

假定建立字典管理表空間user02時,指定預設儲存引數INITIAL和NEXT均為10k,PCTINCREASE為50,以建立表t2為例,說明在字典表管理空間上這些儲存引數的作用.

CREATE TABLE t2 (cola INT) TABLESPACE user02

STORAGE(NEXT 20K MINEXTENTS 4);

執行以上語句後,oracle會建立表T1,並且為其分配尺寸為110k的表段T1,因為MINEXTENTS為4,索引段T1包含4個區,因為建表時為指定INITIAL ,所以第一個區會使用表空間預設儲存引數(尺寸:10k),因為建表時指定NEXT為20K,索引第二個區尺寸為20K,第三和第四分別為30K和50K.


1,顯示已分配區

SELECT extent_id, file_id, block_id,bytes

FROM dba_extents

WHERE owner=’sys’ AND segment_name=’T1’;

其中,extent_id用於標識區編號(0:標識第一個區),file_id用於標識區所在的檔案號,block_id用於標識區的起始塊號,bytes用於標識區的尺寸.

2,顯示空閒區

顯示USER01表空間的剩餘表空間

SELECT sum(bytes) FROM dba_fres_space

WHERE tablespace_name=’USER01’;


管理資料塊空間

塊空間引數

1,PCTFREE

該引數用於指定在資料塊內為UPDATE操作所預留空間的百分比,預設值為10.

設定PCTFREE的原則

使用小的PCTFREE可以節省空間,如果物件的UPDATE操作非常少,應該使用較少的PCTFREE.

使用打的PCTFREE可以提供UPDATE效能,如果物件的UPDATE非常頻繁.應該使用較大的PCTFREE.

2.PCTUSED

該引數用於指定將資料塊標記為可重用塊的已用空間最低百分比,預設值為40.

設定較小的PCTUSED可以降低UPDATE和DELETE的處理開銷,但會增加資料庫的未用空間;設定較大的PCTUSED可以提高空間利用,但會增加INSERT和UPDATE的處理開銷.

3,INITRANS

INITRANS用於指定初始事務入口個數,設定了該引數後,oracle會在資料庫的塊頭上為每個事務入口預留相應的空間.需要注意,INITRANS設定的越大,資料塊的剩餘空間越少,當INITRANS預留的空間被永盡後,oracle會從剩餘空間中分配更多的空間,並且這些空間會變為塊頭空間的永久部分.在10g之前,使用引數MAXTRANS可以指定資料庫的最大事務入口個數,從10g開始,該引數已經被棄用,並且oracle所允許的最大事務入口個數為255.


使用塊空間引數.

1,建立物件時指定塊空間引數.

建立表和簇時,可以使用所有塊空間引數;建立索引時,只能設定引數PCTREEE和INITRANS.

CREATE CLUSTER dept_emp_clu(deptno NUMBER(3))

PCTFREE 20 PCTUSED 40 INITRANS 4;


CREATE TABLE department (deptno NUMBER(2),dname VARCHAR2(10))

PCTFREE 20 PCTUSED 40 INITRANS 4;


CREATE INDEX pk_deptno ON department(depot)

PCTFREE 20 INITRANS 4;

2,改變物件的塊空間引數.

建立資料物件後,如果塊空間引數不合適,可以使用ALTER命令修改塊空間引數.但需要注意,索引的PCTFREE引數不能修改.

ALTER CLUSTER dept_emp_clu PCTFREE 30 PCTUSED 40 INITRANS 4;

ALTER TABLE department PCTFREE 30 PCTUSED 40 INITRANS 4;

ALTER INDEX pk_deptno INITRANS 4;


顯示塊空間引數

1,顯示簇的塊空間引數

SELECT pct_free, pct_used, ini_trans, max_trans

FROM dba_clusters

WHERE owner=’SYSTEM’ AND cluster_name=’DEPT_EMP_CLU’;


2,顯示錶的塊空間引數.

SELECT pct_free, pct_used, ini_trans,max_trans

FROM dba_tables

WHERE owner=’SYSTEM’ AND table_name=’department’;


3,顯示索引的塊空間引數

SELECT pct_free, ini_trans, max_trans

FROM dba_indexes

WHERE owner=’SYSTEM’ AND index_name=’PK_DEPTNO’;

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

相關文章