HWM和delete,drop,truncate的關係
今天下午好好看了oracle中的HWM,也就是高水位線,高水位線是一個段內使用和未使用的資料塊的分界線。
Select * from user_tables where table_name=’TEST03’
其中有blocks,empty_blocks,num_rows其中的blocks也就是此表所佔用的block數量,empty_blocks空的block,num_rows資料行數。User_tables中blocks也就是HWM
User_segment資料字典檢視:blocks就是此segment分配的blocks總數,header_block就是此段斷頭所在的資料塊編號等。
HWM的資訊儲存在段頭中,根據段空間自動管理中是用點陣圖來管理段內的空間分配
Delete,truncate和drop和高水位線的關係
Delete:
delete只是把刪除了高水位線下的block內的資料,但是不會降低高水位線,空閒的資料塊供以後資料插入使用,delete也不會回收表段的資料擴充套件,delete所作的只是更新了block的內的資料塊,不會對segment的HWM,extent改變。
Truncate:
truncate table test02 drop storage 截斷表,重置HWM,回收unused的block到tablespace中去供其餘的物件使用
truncate的實質是:
truncate是新建一個segment然後與現有物件關聯, truncate table tablename drop torage後segment中會新建segment,重構的initial大小的段,但是initial不一定是一個擴充套件的大小,很有可能是多個extent組成了initial段的大小。create table storage(initial 6M),此時oracle會為表段分配初始段initial大小6M,很有可能就是由多個extent組成的!
Truncate和flashback:
早上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的回滾段,truncate是ddl沒有走回滾段,所以無法閃回表,也就會報上述的表的定義已經更改,所以truncate也叫截斷表,改變了表的“內部的一些東西”。
表內部零散blocks和truncate:
整理表內部的碎片,可以用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
(還可以利用exp和imp到segment中去來改變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模式會大量減少日誌,只產生少數undo,append減少了空間的搜尋,產生redo減少) 所以append方式會比平常的insert快,這裡具體redo undo後續還要實際實驗。
新Segment和HWM:
create table test03 select * from test01 where 1<>1
即使此時test03中沒有任何資料,但是oracle中還是分配一個extent也就是8 blocks給此段,剛好db_block_size是8K的也就是64K給此表段,此高水位線blocks是0,然後後續的dml操作會增加HWM,如果沒有shrink,move等操作,一般HWM都只會往上增,不會減少。
[@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1055066/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 簡述truncate、delete和dropdelete
- 關於delete,drop,truncate的問題delete
- drop、delete 與truncatedelete
- 資料庫關鍵詞 drop、truncate和delete的用法資料庫delete
- Truncate,Delete,Drop的比較.delete
- truncate delete drop 區別delete
- truncate,delete,drop的異同點delete
- 詳解SQL中drop、delete和truncate的異同SQLdelete
- truncate,delete,drop的異同點(原)delete
- SQL truncate 、delete與drop區別SQLdelete
- truncate和不帶where子句的delete, 以及drop區別delete
- 資料庫:drop、truncate、delete的區別資料庫delete
- oracle恢復表delete/truncate/drop的方法總結Oracledelete
- Truncate table 詳解及與delete,drop 的區別delete
- Truncate table詳解及與delete,drop的區別delete
- truncate和delete 的區別delete
- mysql資料庫中刪除資料的三種形式 drop和 truncate 和 deleteMySql資料庫delete
- truncate 和 delete 的效能對比delete
- drop table和truncate table的區別
- 關於 Oracle 分割槽索引的正確 DROP 和 TRUNCATE 方法Oracle索引
- [轉][資料庫SQL語句]truncate/delete/drop同與不同資料庫SQLdelete
- RMAN恢復單個表空間或被DROP/DELETE/TRUNCATE的表delete
- delete和truncate刪除的區別delete
- Oracle中truncate和delete的區別Oracledelete
- Truncate table時不管使用drop storage或reuse storage都會講HWM重新設定
- Handler_delete和Com_delete有什麼關係delete
- truncate delete 的區別delete
- SQLSERVER 的 truncate 和 delete 有區別嗎?SQLServerdelete
- MySQL和Oracle中的delete,truncate對比MySqlOracledelete
- 深入解析delete和truncate不同之處:delete
- Diffrence Between delete and truncatedelete
- truncate 比 delete 慢delete
- SQL – TRUNCATE vs DELETESQLdelete
- Oracle中truncate和delete的區別(例項)Oracledelete
- truncate與delete的區別delete
- truncate 比 delete 慢的原因。delete
- 利用Log Explorer將你已經delete,truncate,drop過的資料進行恢復delete
- oracle truncate 與 delete 的區別Oracledelete