HWM和delete,drop,truncate的關係

dotaddjj發表於2011-09-14

今天下午好好看了oracle中的HWM,也就是高水位線,高水位線是一個段內使用和未使用的資料塊的分界線。

Select * from user_tables where table_name=’TEST03’

其中有blocksempty_blocksnum_rows其中的blocks也就是此表所佔用的block數量,empty_blocks空的blocknum_rows資料行數。User_tablesblocks也就是HWM

User_segment資料字典檢視:blocks就是此segment分配的blocks總數,header_block就是此段斷頭所在的資料塊編號等。

HWM的資訊儲存在段頭中,根據段空間自動管理中是用點陣圖來管理段內的空間分配

Deletetruncatedrop和高水位線的關係

Delete

delete只是把刪除了高水位線下的block內的資料,但是不會降低高水位線,空閒的資料塊供以後資料插入使用,delete也不會回收表段的資料擴充套件,delete所作的只是更新了block的內的資料塊,不會對segmentHWMextent改變。

Truncate

truncate table test02 drop storage 截斷表,重置HWM,回收unusedblocktablespace中去供其餘的物件使用

truncate的實質是:

truncate是新建一個segment然後與現有物件關聯, truncate table tablename drop toragesegment中會新建segment,重構的initial大小的段,但是initial不一定是一個擴充套件的大小,很有可能是多個extent組成了initial段的大小。create table storage(initial 6M),此時oracle會為表段分配初始段initial大小6M,很有可能就是由多個extent組成的!

Truncateflashback

早上truncate一個table 然後flashck出錯

flashback table test01 to timestamp to_timestamp('2011-9-13 17:00:00','yyyy-mm-dd hh24:mi:ss')

如果對table進行ddl操作,例如truncate然後再flashback,因為flashback利用的是放置在undo tablespace的回滾段,truncateddl沒有走回滾段,所以無法閃回表,也就會報上述的表的定義已經更改,所以truncate也叫截斷表,改變了表的“內部的一些東西”。

表內部零散blockstruncate

整理表內部的碎片,可以用truncate跟上reuse storage,重新匯入/插入資料,由於重置了新的segment,所以也可以解決段的內部零散blocks

Drop

drop是直接刪除資料字典中的表的資訊,當然也不存在段的任何資訊,HWM也就沒有必要再提了。

(一般如果drop大的表時,先truncate然後再drop)

降低段的HWM

alter table test02 move會將hwm移動,但是在move時需要雙倍的表空間,如果表上有索引需要alter index indexname rebuild

alter table test02 shrink space收縮表 降低HWM

alter table test02 shrink space compact收縮表,但是不會降低HWM

(還可以利用expimpsegment中去來改變HWM,覺得可以新建segment然後exp,imp到新的segment來改變HWM,是否其中還有別的方法。)

回收段內的unused資料擴充套件但是並不能降低HWM

使用alter table test02 deallocate unused會回收unused狀態的extents,也就是會回收segment中高水位線以上的資料塊,但是並不能改變segment中的高水位線。

HWM和全表掃描:

oracle的全表掃描是讀取高水位線HWM一下的所有block,當使用者直接路徑插入行時,直接用append提示插入或sqlldr插入,資料塊直接置於HWM之上,不再使用extents中得unused block

直接插入和HWM

insert /*+append*/ into test01 values(1,'am')

(使用append 而且alter table tablename nologging模式會大量減少日誌,只產生少數undoappend減少了空間的搜尋,產生redo減少) 所以append方式會比平常的insert快,這裡具體redo undo後續還要實際實驗。

SegmentHWM

create table test03 select * from test01 where 1<>1

即使此時test03中沒有任何資料,但是oracle中還是分配一個extent也就是8 blocks給此段,剛好db_block_size8K的也就是64K給此表段,此高水位線blocks0,然後後續的dml操作會增加HWM,如果沒有shrinkmove等操作,一般HWM都只會往上增,不會減少。

[@more@]

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

相關文章