高水位線、行遷移行連結

lusklusklusk發表於2016-07-25

高水位線

HWM是一個標記,用來說明已經有多少資料塊分配給這個segmentDBA_TABLES.BLOCKSHWMHWM通常增長的幅度為一次5個資料塊11g開始預設一次性分配1Mblock大小了,見create table storgedNEXT引數),原則上HWM只會增大,不會縮小,即使將表中的資料全部刪除,HWM還是為原值,由於這個特點,使HWM很象一個水庫的歷史最高水位,這也就是HWM的原始含義,當然不能說一個水庫沒水了,就說該水庫的歷史最高水位為0。但是如果我們在表上使用了truncate命令,則該表的HWM會被重新置為0

a) 全表掃描通常要讀出直到HWM標記的所有的屬於該表資料庫塊,即使該表中沒有任何資料。

b) 即使HWM以下有空閒的資料庫塊,鍵入在插入資料時使用了append關鍵字,則在插入時使用HWM以上的資料塊,此時HWM會自動增大。如果插入資料時沒有append關鍵字,則插入時會在HWM以內找空閒的塊,這樣HWM就不會增大

高水位線內的塊分4種,一種是滿了的塊,一種沒滿的塊,一種是extents擴充套件的空塊,一種是刪除資料後的空塊

 

 

DBA_SEGMENTS.BLOCKS=DBA_TABLES.BLOCKS+ DBA_TABLES.EMPTY_BLOCKS

 

DBA_TABLES.BLOCKS代表該表中曾經使用過得資料庫塊的數目,即高水位線內的塊。 DBA_TABLES.EMPTY_BLOCKS 代表分配給該表,但是在高水位線以上的資料庫塊。(This column is populated only if you collect statistics on the table using the DBMS_STATS package)因為每一次對錶進行擴充都是以extent為單位的,所以會出現空資料塊。

 

DBA_SEGMENTS.BLOCKS=DBA_TABLES.BLOCKS+ DBA_TABLES.EMPTY_BLOCKS

Delete操作的時候,dba_segments.Blocksuser\dba_tables.Blocks user\dba_tables.empty_blocks三者都不會減小

 

insert /*+ append */ into XXX values(XXX);

使用append提示進行insert時系統不去查詢freelist連結串列中的空閒塊,直接在高水標記位以上插入資料,因此速度比較快。但若是對於經常delete的表,浪費磁碟空間太大。

 

 

 

 

行遷移生原因:update

當某一行發生update操作時導致記錄行長度有增加引發當前的資料不能在容納在當前塊,就會產生行遷移。行遷移時rowid不會改變,就是整行資料將會移動到新的塊上,舊的塊僅僅保留的是指向新塊的地址資訊,發生行遷移會對效能產生影響,因為讀這條記錄會讀兩個BLOCK

行遷移和索引分裂的一些異同,可以互相理解

 

行連結(產生原因:insert

當一行資料太大而不能在一個單資料塊容納時,行連結由此產生。舉例來說,當你使用了4kbOracle 資料塊大小,而你需要插入一行資料是8k Oracle則需要使用3個資料塊分成片來儲存。因此,引起行連結的情形通常是,表上行記錄的大小超出了資料庫Oracle塊的大小。行連線同樣會影響效能,因為讀一條記錄至少會讀兩個BLOCK

表上使用了LONG LONG RAW資料型別的時候容易產生行連結。其次表上多於255列時Oracle會將這些過寬的表分片而產生行連結

 

 

 

 

檢視行遷移或行連結的表

select * From dba_tables where nvl(chain_cnt,0)<>0

chain_cnt Number of rows in the table that are chained from one data block to another or that have migrated to a new block, requiring a link to preserve the old rowid. This column is updated only after you analyze the table.

 

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

相關文章