在Oracle數據庫中,DBA可以通過觀測一定的表或視圖來了解當前空間的使用狀況,進而作出可能的調整決定。
一.表空間的自由空間
通過對表空間的自由空間的觀察,可用來判斷分配給某個表空間的空間是太多還是不夠。請看下列的語句
SQL > select a.file_id "FileNo",a.tablespace_name "Tablespace_name", 2 a.bytes "Bytes",a.bytes-sum(nvl(b.bytes,0)) "Used", 3 sum(nvl(b.bytes,0)) "Free", 4 sum(nvl(b.bytes,0))/a.bytes*100 "%free" 5 from dba_data_files a, dba_free_space b 6 where a.file_id=b.file_id(+) 7 group by a.tablespace_name , 8 a.file_id,a.bytes order by a.tablespace_name; File Tablespace No _nameBytes Used Free %free ------ --------- -------- --------- --------- --------- 11IDX_JF .146E+09 849305600 1.297E+09 60.431806 9 JFSJTS 2.146E+09 1.803E+09 343793664 16.016961 10JFSJTS 2.146E+09 1.359E+09 787431424 36.685546 2 RBS523239424 359800832 163438592 31.235909 12RBS1.610E+09 1.606E+09 3104768 .19289495 8 RBSJF 3.220E+09 2.716E+09 504356864 15.662396 7 SFGLTS 2.146E+09 1.228E+09 918159360 42.776014 6 SFSJTS 2.146E+09 1.526E+09 620093440 28.889457 1 SYSTEM 523239424 59924480 463314944 88.547407 3 TEMP 523239424294912 522944512 99.943637 4 TOOLS 15728640 12582912 314572820 5 USERS 7340032 81927331840 99.888393 12 rows selected.
可以看出,在FileNo為12的表空間RBS中,只有0.19%的分配空間未被使用,這個比例太小了,而在SYSTEM及TEMP等表空間中,高達80%以上的空間未被利用,對於生產型數據庫,這個表空間的設置有些偏高。
關於自由空間的管理,有下面的一些建議:
利用Export及Import命令卸出和裝入表空間可以釋放大量的空間,從而緩解增加另外的數據文件的要求。
如果包含具有高插入(insert)和更新(update)活動的表的表空間中自由空間的比重下降到了15%以下,要為此表空間增加更多的空間。
對於一個基本是靜態表數據的表空間,如果有多於20%的自由空間,則可以考慮減少分配給它的文件空間量。
減少SYSTEM表空間的空間量比較困難,因為那要重建數據庫。
二 表及索引的擴展
A.為了防止表或索引被過分擴展,及時實現對數據庫的調整,用戶應當經常對有關對象進行觀察。
我們可以認為,擴展區域大於5個的表或索引為過分擴展(overextended)。請看下面的語句:
SQL > select substr(segment_name,1,15) Segment_name,segment_type, 2 substr(tablespace_name,1,10) Tablepace_name,extents,Max_extents 3from dba_segments 4where extents >5 and owner='JFCL' 5order by segment_name; SEGMENT_NAMESEGMENT TABLEPACE_ EXTENTS MAX_EXTENTS _TYPE -------------- --------- ---------- CHHDFYB TABLE JFSJTS 11121 CHHDFYB_DHHMINDEX JFSJTS9121 DJHZFYB_BF TABLE JFSJTS 17500 DJHZFYB_DJHMINDEX IDX_JF6500 DJHZFYB_JZHMINDEX IDX_JF7500 GSMFYB TABLE JFSJTS 11121 JFDHTABLE JFSJTS 14500 JFDH_DHHM INDEX IDX_JF 61500 JFDH_JZHM INDEX IDX_JF 64500 XYKFYB TABLE JFSJTS7121 YHDATABLE JFSJTS6500 YHDA_BAKTABLE JFSJTS6500 YHHZFYB_12 TABLE JFSJTS 10500 13 rows selected.
通過觀察, DBA可以及時發現問題並進行相應的處理。
我們可以利用export卸出表,然後刪除表,再利用import命令將表裝入,這樣,可以將不連續的區域合並成一個連續的空間。
B.如果用戶希望對表的空間設置進行優化,例如,需要改變表EMP的initial參數,可以采用下面的方法:
1.在將EMP表卸出並刪除後執行imp命令時使用indexfile參數:
imp userid=scott/tiger file=emp.dmp indexfile=emp.sql Oracle把表和索引的創建信息寫到指定的文件,而不是把數據寫回。
2.打開emp.sql文件:
REM CREATE TABLE "SCOTT"."EMP" ("EMPNO" NUMBER(4, 0), "ENAME" REM VARCHAR2(10), "JOB" VARCHAR2(9), "MGR" NUMBER(4, 0), "HIREDATE" DATE, REM "SAL" NUMBER(7, 2), "COMM" NUMBER (7, 2), "DEPTNO" NUMBER(2, 0)) REM PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 LOGGING STORAGE(INITIAL REM 10240 NEXT 10240 MINEXTENTS 1 MAXEXTENTS 121 PCTINCREASE 50 FREELISTS REM 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USER_DATA" ; REM ... 14 rows