在Oracle數據庫中
DBA可以通過觀測一定的表或視圖來了解當前空間的使用狀況
進而作出可能的調整決定
一
表空間的自由空間
通過對表空間的自由空間的觀察
可用來判斷分配給某個表空間的空間是太多還是不夠
請看下列的語句
SQL > select a
file_id
FileNo
a
tablespace_name
Tablespace_name
a
bytes
Bytes
a
bytes
sum(nvl(b
bytes
))
Used
sum(nvl(b
bytes
))
Free
sum(nvl(b
bytes
))/a
bytes*
%free
from dba_data_files a
dba_free_space b
where a
file_id=b
file_id(+)
group by a
tablespace_name
a
file_id
a
bytes order by a
tablespace_name;
File Tablespace
No _nameBytes Used Free %free
IDX_JF
E+
E+
JFSJTS
E+
E+
JFSJTS
E+
E+
RBS
RBS
E+
E+
RBSJF
E+
E+
SFGLTS
E+
E+
SFSJTS
E+
E+
SYSTEM
TEMP
TOOLS
USERS
rows selected
可以看出
在FileNo為
的表空間RBS中
只有
%的分配空間未被使用
這個比例太小了
而在SYSTEM及TEMP等表空間中
高達
%以上的空間未被利用
對於生產型數據庫
這個表空間的設置有些偏高
關於自由空間的管理
有下面的一些建議
利用Export及Import命令卸出和裝入表空間可以釋放大量的空間
從而緩解增加另外的數據文件的要求
如果包含具有高插入(insert)和更新(update)活動的表的表空間中自由空間的比重下降到了
%以下
要為此表空間增加更多的空間
對於一個基本是靜態表數據的表空間
如果有多於
%的自由空間
則可以考慮減少分配給它的文件空間量
減少SYSTEM表空間的空間量比較困難
因為那要重建數據庫
二 表及索引的擴展
A
為了防止表或索引被過分擴展
及時實現對數據庫的調整
用戶應當經常對有關對象進行觀察
我們可以認為
擴展區域大於
個的表或索引為過分擴展(overextended)
請看下面的語句
SQL > select substr(segment_name
)
Segment_name
segment_type
substr(tablespace_name
)
Tablepace_name
extents
Max_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=emp
dmp indexfile=emp
sql Oracle把表和索引的創建信息寫到指定的文件
而不是把數據寫回
打開emp
sql文件
REM CREATE TABLE
SCOTT
EMP
(
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中執行emp
sql
裝入數據
imp userid=scott/tiger ignore=y file=emp
dmp
需要注意的是
ignore參數必須設為Y
C
可以用下面的語句來觀察表或索引距離達到最大擴展的狀況
UNUSE
為距離達到最大擴展的值
在User_extents表中
extent_id是從
開始記述數的
SQL >select a
table_name
TABLE_NAME
max
(a
max_extents)
MAXEXTENTS
max(b
extent_id)+
IN USE
MAX
(a
max_extents)
(max(b
extent_id)+
)
UNUSE
from user_tables a
user_extents b
where a
table_name=b
segment_name
group by a
table_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/17904.html