HWM和delete,drop,truncate的关系
今天下午好好看了oracle中的HWM,也就是高水位線,高水位線是一個(gè)段內(nèi)使用和未使用的數(shù)據(jù)塊的分界線。
Select * from user_tables where table_name=’TEST03’
其中有blocks,empty_blocks,num_rows其中的blocks也就是此表所占用的block數(shù)量,empty_blocks空的block,num_rows數(shù)據(jù)行數(shù)。User_tables中blocks也就是HWM
User_segment數(shù)據(jù)字典視圖:blocks就是此segment分配的blocks總數(shù),header_block就是此段斷頭所在的數(shù)據(jù)塊編號(hào)等。
HWM的信息存儲(chǔ)在段頭中,根據(jù)段空間自動(dòng)管理中是用位圖來(lái)管理段內(nèi)的空間分配
Delete,truncate和drop和高水位線的關(guān)系
Delete:
delete只是把刪除了高水位線下的block內(nèi)的數(shù)據(jù),但是不會(huì)降低高水位線,空閑的數(shù)據(jù)塊供以后數(shù)據(jù)插入使用,delete也不會(huì)回收表段的數(shù)據(jù)擴(kuò)展,delete所作的只是更新了block的內(nèi)的數(shù)據(jù)塊,不會(huì)對(duì)segment的HWM,extent改變。
Truncate:
truncate table test02 drop storage 截?cái)啾?#xff0c;重置HWM,回收unused的block到tablespace中去供其余的對(duì)象使用
truncate的實(shí)質(zhì)是:
truncate是新建一個(gè)segment然后與現(xiàn)有對(duì)象關(guān)聯(lián), truncate table tablename drop torage后segment中會(huì)新建segment,重構(gòu)的initial大小的段,但是initial不一定是一個(gè)擴(kuò)展的大小,很有可能是多個(gè)extent組成了initial段的大小。create table storage(initial 6M),此時(shí)oracle會(huì)為表段分配初始段initial大小6M,很有可能就是由多個(gè)extent組成的!
Truncate和flashback:
早上truncate一個(gè)table 然后flashck出錯(cuò)
flashback table test01 to timestamp to_timestamp('2011-9-13 17:00:00','yyyy-mm-dd hh24:mi:ss')
如果對(duì)table進(jìn)行ddl操作,例如truncate然后再flashback,因?yàn)?/span>flashback利用的是放置在undo tablespace的回滾段,truncate是ddl沒(méi)有走回滾段,所以無(wú)法閃回表,也就會(huì)報(bào)上述的表的定義已經(jīng)更改,所以truncate也叫截?cái)啾?#xff0c;改變了表的“內(nèi)部的一些東西”。
表內(nèi)部零散blocks和truncate:
整理表內(nèi)部的碎片,可以用truncate跟上reuse storage,重新導(dǎo)入/插入數(shù)據(jù),由于重置了新的segment,所以也可以解決段的內(nèi)部零散blocks。
Drop:
drop是直接刪除數(shù)據(jù)字典中的表的信息,當(dāng)然也不存在段的任何信息,HWM也就沒(méi)有必要再提了。
(一般如果drop大的表時(shí),先truncate然后再drop)
降低段的HWM:
alter table test02 move會(huì)將hwm移動(dòng),但是在move時(shí)需要雙倍的表空間,如果表上有索引需要alter index indexname rebuild
alter table test02 shrink space收縮表 降低HWM
alter table test02 shrink space compact收縮表,但是不會(huì)降低HWM
(還可以利用exp和imp到segment中去來(lái)改變HWM,覺(jué)得可以新建segment然后exp,imp到新的segment來(lái)改變HWM,是否其中還有別的方法。)
回收段內(nèi)的unused數(shù)據(jù)擴(kuò)展但是并不能降低HWM:
使用alter table test02 deallocate unused會(huì)回收unused狀態(tài)的extents,也就是會(huì)回收segment中高水位線以上的數(shù)據(jù)塊,但是并不能改變segment中的高水位線。
HWM和全表掃描:
oracle的全表掃描是讀取高水位線HWM一下的所有block,當(dāng)用戶直接路徑插入行時(shí),直接用append提示插入或sqlldr插入,數(shù)據(jù)塊直接置于HWM之上,不再使用extents中得unused block。
直接插入和HWM
insert /*+append*/ into test01 values(1,'am')
(使用append 而且alter table tablename nologging模式會(huì)大量減少日志,只產(chǎn)生少數(shù)undo,append減少了空間的搜索,產(chǎn)生redo減少) 所以append方式會(huì)比平常的insert快,這里具體redo undo后續(xù)還要實(shí)際實(shí)驗(yàn)。
?
新Segment和HWM:
create table test03 select * from test01 where 1<>1
即使此時(shí)test03中沒(méi)有任何數(shù)據(jù),但是oracle中還是分配一個(gè)extent也就是8 blocks給此段,剛好db_block_size是8K的也就是64K給此表段,此高水位線blocks是0,然后后續(xù)的dml操作會(huì)增加HWM,如果沒(méi)有shrink,move等操作,一般HWM都只會(huì)往上增,不會(huì)減少。
posted on 2012-11-15 22:13 Anders' Yan 閱讀(...) 評(píng)論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/yansc/archive/2012/11/15/2772336.html
總結(jié)
以上是生活随笔為你收集整理的HWM和delete,drop,truncate的关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: (0.2)linux下Mysql的安装配
- 下一篇: C#不支持XPATH2.0