使用LMT時
不更新數據字典
不產生回滾活動
自動跟蹤相鄰的自由空間
不需要合並盤區
通過更新自由塊和已用塊的位映射來管理空間
避免了遞歸的空間管理操作
有UNIFORM和AUTOALLOCATE兩種指定盤區大小方法
缺省為AUTOALLOCATE
臨時表空間用LMT管理則僅僅只能用UNIFORM分配方式
針對LMT
NEXT
PCTINCREASE
MINEXTENTS
MAXEXTENTS
and DEFAULT STORAGE 將不再起作用
用UNIFORM指定一個值
表示盤區大小
缺省是
M
而對AUTOALLOCATE
你只要指定一個初始盤區的大小
ORACLE會自動用一個最佳值為其他盤區指定大小
最小是
KB
這也是固定表空間中系統管理的缺省盤區大小
這裡我還不明白
這是說ORACLE為其他的盤區分配的盤區大小是不定的但最小是
Kb
不知這個理解對不對
那麼初始盤區該設多大呢?最小也是
KB吧
如此說AUTOALLOCATE方式比UNIFORM方式更好嗎?
盤區的分配
ORACLE首先在第一個屬於這個表空間的數據文件中分配一個新的盤區
先為需要的相鄰自由塊數目在這個數據文件中查找位映射(BITMAP)
如果這個數據文件沒有足夠的自由塊數目
ORACLE則查找下一個數據文件
當這個盤區釋放了
ORACLE修改數據文件的位映射
位映射管理
假設指定的一個盤區大小是
KB
一個數據塊的大小是
KB
則
/
=
表示位映射中的每一位都表示
塊
我的環境是WIN
+ORACLE
db_block_size=
問題一
理解BITMAP管理
首先建立表空間
SYS@ORAEXP:ADMIN> create tablespace abc datafile
d:\oracle
\oradata\oraexp\abc
dbf
size
k extent management local uniform size
k;
立即查看DBA_FREE_SPACE
SYS@ORAEXP:ADMIN> select * from dba_free_space where tablespace_name=
ABC
;
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS
RELATIVE_FNO
ABC
這裡看到block_id=
說明已經使用了
塊
這
塊就是給這個數據文件分配的BITMAP使用的
*
=
KB
另外
我們建立這個表空間是
KB
也就是
塊
但現在只有
塊
加上已用的
塊
也只有
塊
還有
塊到哪裡去了?因為一個盤區是
/
=
個塊
個塊還不能構成一個盤區
所以被浪費了
這就是為什麼上面說的在建立表空間數據文件是要在數據文件大小上再加上
K的原因了
再看看效果
SYS@ORAEXP:ADMIN> create tablespace abc_
datafile
d:\oracle
\oradata\oraexp\abc_
dbf
size
k extent management local uniform size
k;
SYS@ORAEXP:ADMIN> select * from dba_free_space where tablespace_name=
ABC_
;
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS
RELATIVE_FNO
ABC_
只要加上
K
就能救回很多空間來!!!
問題
盤區的分配
建立一張表
SYS@ORAEXP:ADMIN> CREATE TABLE ABC(A VARCHAR
(
)) TABLESPACE ABC STORAGE
(INITIAL
K NEXT
K );
SYS@ORAEXP:ADMIN> SELECT* FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME=
ABC
;
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS
RELATIVE_FNO
ABC
可見並沒有按照建表定義裡的參數INITIAL來分配表空間
而是按照定義的UNIFORM SIZE來分配盤區的
如果定義INITIAL參數大於UNIFORM SIZE 定義呢?
先DROP 表 ABC 恢復到表空間ABC初始定義的狀態
再重建表ABC
SYS@ORAEXP:ADMIN> CREATE TABLE ABC(A VARCHAR
(
)) TABLESPACE ABC STORAGE
(INITIAL
K NEXT
K);
SYS@ORAEXP:ADMIN> SELECT * FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME=
ABC
;
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS
RELATIVE_FNO
ABC
分配
塊
也就是
KB
因為建表是定義INITIAL是
KB
按照UNIFORM SIZE
K 只能分配
KB才能滿足
再讓表擴展一個盤區
SYS@ORAEXP:ADMIN> ALTER TABLE ABC ALLOCATE EXTENT;
表已更改
SYS@ORAEXP:ADMIN> SELECT * FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME=
ABC
;
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS
RELATIVE_FNO
ABC
看出只用了
塊
也就是
KB
還是按照UNIFORM SIZE
K分配的
並沒有使用建表裡NEXT
KB參數
SYS@ORAEXP:ADMIN> L
SELECT INITIAL_extent
next_extent
min_extentS
max_extentS from dba_segmentS
* where segment_name=
ABC
SYS@ORAEXP:ADMIN> /
INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS
這裡就可以看到ABC表的初始盤區是
KB
具體盤區分配
SYS@ORAEXP:ADMIN> select extent_id
file_id
block_id
bytes
blocks from
dba_extents where segment_name=
ABC
;
EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
得到結論
建LMT表空間時
考慮在建立的數據文件大小上再加
KB
對於LMT表空間
建表STORAGE裡的參數基本沒什麼用處了
僅僅是在第一次分配時參考INITIAL和NEXT參數分配空間
實際還是按照UNIFORM SIZE來分配盤區
EXP/IMP時應該避免使用COMPRESS=Y參數
否則初始盤區會很大的
要做到准確的性能測試
其實是很復雜的
一般而言
雖然LMT的表空間不會比DICT的表空間性能上強很多
但是不會更差 的
你要做性能的對比測試
應該給他們完全相等的條件
比如
你第一次已經做了測試
做了大量的數據插入
但是在第二次做測試的時候
可能就會出現ckpt 不能完成的情況
這樣一來
第二次的性能數據肯定會大大打折扣的
至於空間管理
我現在的
基本上都采用了LMT + Uniform 的大小
按照表的增長和大
小來劃分不同的表空間
基本上不再區分索引和表了
From:http://tw.wingwit.com/Article/program/Oracle/201311/17473.html