行遷移和行連接

行遷移:
Oracle數據塊會保留部分空間供之後更新使用。
PCTFREE定義一個塊保留的空間百分比,默認是10,表示當數據塊的可用空間低於10%後,就不能夠被insert了,只能被update(具體看下面的PCTFREE介紹)。
當一條記錄被更新時,數據庫引擎首先會嘗試在它保存的數據塊中尋找足夠的空閒空間,若是沒有足夠的空閒空間可用,這條記錄將被拆分爲兩個部分,第一個部分進包括指向第二個部分的rowid,該部分任然保留在原來的數據塊中,第二個部分包含全部的具體數據,將保存到另一個新的數據塊中,這個就成爲行遷移。


行連接:
行連接和行遷移不一樣,行連接是當一條記錄太大,在一個數據塊中沒法存入,這時會被拆分爲2個或以上的部分,存儲在多個塊中,這多個塊之間會構造一個鏈。




行遷移是因爲更新致使的,而行連接的緣由則可能爲:
1)直接插入大的記錄;
2)更新記錄致使記錄大於一個數據塊,在這時,這樣記錄可能會同時變爲行遷移和行連接。


帶來的問題:
行遷移不會影響全掃描,由於第一個部分不包含數據,會被直接跳過;但對於經過rowid進行訪問(索引掃描或者直接使用rowid查詢),則開銷會翻倍,主要因爲一次讀取須要訪問兩個塊。
行連接則和數據訪問方式無關,每次訪問到第一個記錄片斷以後,都須要經過rowid去訪問其餘的記錄片斷。
行遷移和行連接也會影響行級鎖,由於每一個記錄片斷都須要持有鎖,鎖的開銷和記錄片斷的個數的增加成正比。


分析:
$ORACLE_HOME/rdbms/admin/UTLCHAIN.SQL建立表
analyze table <table_name> list chained rows(會鎖表)
select table_name,head_rowid from CHAINED_ROWS


解決:
行遷移:
1.將遷移的數據複製到臨時表中,在原表上刪除再從新插入這些數據
2.經過導出、導入或者ALTER TABLE MOVE對錶進行重整;
行連接:
只能經過修改塊大小來解決。可經過將常常訪問的字段放在前面,不常常訪問的字段放在後面,以提高數據訪問性能。數據庫

相關文章
相關標籤/搜索