以下的文章主要是介紹Oracle空間管理的技巧我們大家都知道在Oracle數據庫中DBA是可以通過相應的表或是視圖來了解當前的空間具體使用的狀況觀測從而作出可能的調整決定
一表空間的自由空間
通過對表空間的自由空間的觀察可用來判斷分配給某個表空間的空間是太多還是不夠請看下列的語句
SQL > select afile_id FileNoatablespace_name
Tablespace_name
abytes Bytesabytessum(nvl(bbytes)) Used
sum(nvl(bbytes)) Free
sum(nvl(bbytes))/abytes* %free
from dba_data_files a dba_free_space b
where afile_id=bfile_id(+)
group by atablespace_name
afile_idabytes order by atablespace_name;
File Tablespace
No _nameBytes Used Free %free
IDX_JF E+ E+
JFSJTS E+ E+
JFSJTS E+ E+
RBS
RBSE+ E+
RBSJF E+ E+
SFGLTS E+ E+
SFSJTS E+ E+
SYSTEM
TEMP
TOOLS
USERS
rows selected
可以看出在FileNo為的表空間RBS中只有%的分配空間未被使用這個比例太小了而在SYSTEM及TEMP等表空間中高達%以上的空間未被利用對於生產型數據庫這個表空間的設置有些偏高
關於自由Oracle空間管理有下面的一些建議
利用Export及Import命令卸出和裝入表空間可以釋放大量的空間從而緩解增加另外的數據文件的要求
如果包含具有高插入(insert)和更新(update)活動的表的表空間中自由空間的比重下降到了%以下要為此表空間增加更多的空間
對於一個基本是靜態表數據的表空間如果有多於%的自由空間則可以考慮減少分配給它的文件空間量
減少SYSTEM表空間的空間量比較困難因為那要重建數據庫
二 表及索引的擴展
A為了防止表或索引被過分擴展及時實現對數據庫的調整用戶應當經常對有關對象進行觀察
我們可以認為擴展區域大於個的表或索引為過分擴展(overextended)請看下面的語句
SQL > select substr(segment_name)
Segment_namesegment_type
substr(tablespace_name)
Tablepace_nameextentsMax_extents
from dba_segments
where extents > and owner=JFCL
order by segment_name;
SEGMENT_NAMESEGMENT TABLEPACE_
EXTENTS MAX_EXTENTS
_TYPE
CHHDFYB TABLE JFSJTS
CHHDFYB_DHHMINDEX JFSJTS
DJHZFYB_BF TABLE JFSJTS
DJHZFYB_DJHMINDEX IDX_JF
DJHZFYB_JZHMINDEX IDX_JF
GSMFYB TABLE JFSJTS
JFDHTABLE JFSJTS
JFDH_DHHM INDEX IDX_JF
JFDH_JZHM INDEX IDX_JF
XYKFYB TABLE JFSJTS
YHDATABLE JFSJTS
YHDA_BAKTABLE JFSJTS
YHHZFYB_ TABLE JFSJTS
rows selected
通過觀察 DBA可以及時發現問題並進行相應的處理
我們可以利用export卸出表然後刪除表再利用import命令將表裝入這樣可以將不連續的區域合並成一個連續的空間
B如果用戶希望對表的空間設置進行優化例如需要改變表EMP的initial參數可以采用下面的方法
在將EMP表卸出並刪除後執行imp命令時使用indexfile參數
imp userid=scott/tiger file=empdmp indexfile=empsql Oracle把表和索引的創建信息寫到指定的文件而不是把數據寫回
打開empsql文件
REM CREATE TABLE SCOTTEMP (EMPNO
NUMBER( ) ENAME
REM VARCHAR() JOB VARCHAR()
MGR NUMBER( ) HIREDATE DATE
REM SAL NUMBER( ) COMM NUMBER
( ) DEPTNO NUMBER( ))
REM PCTFREE PCTUSED INITRANS
MAXTRANS LOGGING STORAGE(INITIAL
REM NEXT MINEXTENTS MAXEXTENTS
PCTINCREASE FREELISTS
REM FREELIST GROUPS BUFFER_POOL DEFAULT)
TABLESPACE USER_DATA ;
REM rows
對它進行編輯去除REM等信息找到Initial參數根據需要改變它
在SQL*plus中執行empsql
裝入數據
mp userid=scott/tiger ignore=y file=empdmp
需要注意的是ignore參數必須設為Y
C可以用下面的語句來觀察表或索引距離達到最大擴展的狀況UNUSE為距離達到最大擴展的值在User_extents表中extent_id是從開始記述數的
SQL >select atable_name TABLE_NAMEmax
(amax_extents) MAXEXTENTS
max(bextent_id)+ IN USE MAX
(amax_extents)(max(bextent_id)+) UNUSE
from user_tables a user_extents b
where atable_name=bsegment_name
group by atable_name ORDER BY ;
TABLE_NAME MAXEXTENTS IN USEUNUSE
YZPHB
SHJYB
SHFYB
RCHDB
SJTXDZB
SJTXDAB
CHYHB
JFDH
rows selected
如果UNUSE小到一定的程度我們就應該加以關注進行適當的調整處理
三 關於連續空間
可以用下面的語句來查看數據庫中的自由空間
SQL > select * from dba_free_space
where tablespace_name=SFSJTS
order by block_id;
TABLESPACE FILE_ID BLOCK_ID BYTESBLOCKS
_NAME
SFSJTS
SFSJTS
SFSJTS
SFSJTS
SFSJTS
SFSJTS
SFSJTS
SFSJTS
SFSJTS
SFSJTS
rows selected
我們可以通過命令的結果來估計相鄰自由空間的真正數量對每一行用起始快的id(BLOCK_ID)加上自由塊(BLOCKS)的數量如果其和與下一行的塊id(BLOCK_ID)相等則此兩行是連續的如上例第二行和第三行+=而+!=所以從block_id為開始有+=個block的連續空間
在Oracle數據庫的後台系統監視器(SMON)周期性地合並自由空間相鄰的塊以得到更大的連續塊而DBA可以用SQL命令來完成這個工作
alter tablespace tablespace_name coalesce;
Oracle空間管理對數據庫的工作性能有重要影響其管理方法值得我們認真摸索研究
From:http://tw.wingwit.com/Article/program/Oracle/201311/17790.html