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都只會往上增,不會減少。
posted on 2012-11-15 22:13 Anders' Yan 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/yansc/archive/2012/11/15/2772336.html
總結
以上是生活随笔為你收集整理的HWM和delete,drop,truncate的关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (0.2)linux下Mysql的安装配
- 下一篇: golang——strconv包常用函数