move和shrink的原理和redo的產生 ,利用rowid的含義實用block個數

dotaddjj發表於2011-09-20

前幾篇blog中整理了關於HWMdelete drop truncate的一些關係。補充一下HWM的另外一些東東。

首先減少HWM的方法上次提到了moveshrink

Alter table test09 move

透過move移動物件,但是move之後,需要重建索引,而且move的過程中會影響線上使用

Alter index indexName rebuild

Move原理是建立一個新表,所以需要兩倍的空間,然後將原表的資料插入新的表中,然後在刪除原來的表和資料,釋放空間。可以看出move的過程中資料行的rowid改變了,所以需要重構索引。

利用shrink線上收縮表內的HWM

Alter table test09 enable row movement

Alter table test09 shrink space

因為使用線上收縮空間shrink space是利用了一系列的dML操作來實現,主要是把HWM最後的塊放在HWM最前端。

需要說明的是shrink space需要在表空間自動段空間管理,所以system等表空間無法shrink

降低HWM shrink需要行遷移:

剛開始不清楚shrink的具體細節,主要是移動資料所在的block,要改變資料行所在的block地址,所以肯定需要行遷移來完成。

閃回也需要行遷移

同樣在10g中閃回表也需要開啟行遷移,閃回也是利用回滾段進行一系列的dml操作,可能改變rowid地址,此時也需要行遷移來保證rowid不會改變。

Move需要重建index shrink不需要:

Alter table test09 shrink space;此時還對索引進行了維護。如果tableindex數量較多,維護起來也需要消耗成本,在業務不繁忙時shrink space

收縮表時一起收縮索引:

Alte table test09 shrink space cascade

還有一些降低HWM的方法:

1 rename需要回收表,建立test09同名表然後insert進去

2 匯出,truncate,匯入

上述方法都是利用重建新段時HWM0然後插入資料來回收的,適用性有限。

檢視資料行實際使用了多少資料塊,eygle的提供的sql

Select count(distinct(substr(rowid,1,15))) from test04

來分析下rowid的東東:rowid4部分組成。

資料物件編號 檔案編號 塊編號 行編號

OOOOOO FFF BBBBBB RRR

所以rowid的前15位就可以唯一決定資料行是屬於某個資料塊,上述sql就可以檢視錶中資料行實際佔用的資料塊個數。

測試下shrink space生成的redo

SQL> select name,value from v$statname a,v$mystat b

2 where a.statistic#=b.statistic# and a.name='redo size';

NAME VALUE

---------------------------------------------------------------- ----------

redo size 42568

SQL> alter table test09 shrink space;

Table altered

SQL>

SQL> select name,value from v$statname a,v$mystat b

2 where a.statistic#=b.statistic# and a.name='redo size';

NAME VALUE

---------------------------------------------------------------- ----------

redo size 150236

在測試過程中發現

alter table test09 enable row movement

analyze table test09 compute statistics

開啟行遷移和分析表也會產生少量redo

這兩天開始接觸了ASMRAC,本本買了效能不錯裝個虛擬機器,然後裝下linux系統來實現下racASM。有心得了跟大家分享!要學習linux了!

[@more@]

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

相關文章