行鏈結與行遷移

2021-06-05 09:03:23 字數 2881 閱讀 4749

行遷移:行遷移一般產生在更新操作中, 當更新操作導致行長增加了, 而block的自由空間已經沒有, 這時oracle把整行記錄遷移到乙個新的block中, 並在原來block中存放新block的鏈結, 行遷移產生。

2.行鏈結與行遷移的檢測

1)建立chained_rows表

利用oracle資料庫自身提供的指令碼utlchain1sql (在$oracle_ home / rdbms/admin目錄下) 生成chained_rows表, 從建表指令碼utlchain1sql 看到, 對於分割槽 表,cluster  表都是適用的。在大多數資料中心系統中, 預期的海量資料儲存均為適用分割槽表。

2)逐個分析需要檢測的表利用analyze table table _ name l ist cha inedrows into chained _ rows命令分析表, 分析結果存在chained_ rows表中。

3)查詢cha ined_ rows表查詢表chained_ rows, 得到表上有多少行鏈結和行遷移。

3.行鏈結與行遷移的消除

行鏈結的消除

行鏈結主要是由於資料庫的db_ block_ size不夠大,一行記錄資料不能在乙個block中完整儲存引起的, 因此可以增大db_ block_ size來避免產生行鏈結, 但是在oracle9i之前, 資料庫建立後db_ block _ size是不可改變的, 只能採取其它變通辦法來解決行鏈結問題, 對於oracle9i及以後, 是可以支援針對不同的表空間指定不同的db _block_ size的。

可以設定存在分割槽的表所在的表空間具有更大的db_ block_ size, 比如32kb, 就能解決行鏈結問題。但是, 放大了db_ block_size, 將會導致儲存空間需求成倍增長, 因此, 在實際應用中, 解決行鏈結問題不能僅靠放大db_ block_ size, 要綜合考慮儲存空間和系統特性。

行遷移的消除

對於行遷移的清除, 一般來說分為兩個步驟:

第一步, 控制住行遷移的增長, 使其不再增多;

第二步, 清除掉以前存在的行遷移。

行遷移產生的主要原因是表中記錄更新時block中沒有足夠的空閒空間引起的, 而要實現第一步控制住行遷移的增長, 就必須為block留出足夠的空閒空間, 否則即使清除了當前的行遷移後很快會產生新的行遷移。當然,空閒空間也不是越大越好, 如果設定過大, 會導致空間大量浪費。一般有兩種方法來確定空閒空間的大小。

一般是使用微調的方法,監控和調整表的當前pctfree值,每次增加不超過5個百分點, 然後使用analyze tabletable_ name l ist cha ined rows into chained_ rows命令分析行遷移和行鏈結的增長情況, 直到表的行遷移基本保持不增長了為止。但是注意也不要把pctfree調的過大, 一般在40%以下, 否則會造成空間的很大浪費和增加資料庫訪問的i/o。另外種方法是通過計算出來的,但是不一定很準確,一般不適用。

設定空閒空間大小後, 就需要清除表上存在的行遷移了。清除行遷移有很多方法, 下面筆者將逐一介紹這些方法以及它們各自適用的不同情況, 但是這些方法的根本都在於對發生行遷移的資料進行重組。

方法一:傳統方法

(1)將表中發生行遷移的記錄行放入臨時表中儲存;

(2)刪除原來表中存在行遷移的記錄行;

(3)將臨時表中的資料重新插入到原來的表中;

(4)刪除臨時表。

優點是執行起來過程比較簡單, 容易實現。缺點一是沒有考慮到表關聯的情況, 對於有關聯的表, 步驟2根本無法執行; 二是這種方法在插入和刪除資料的時候都沒有disable掉索引, 這樣導致時間主要消耗在刪除和插入時維持索引樹的均衡上, 因此這種方法只能適用於小資料量而且表上無任何外來鍵關聯的表。

方法二:改善方法

改進方法與傳統方法的區別在於把錶中行遷移的行放到臨時表以前先把錶的外來鍵約束禁用, 在從臨時表插回到原表之後再把外來鍵約束啟用。這種演算法考慮到表之間的關聯, 還可以靈活地利用工具生成表的關聯資訊, 是一種比較適合用於清除行遷移的一種方法。但是這種方法在插入記錄和刪除記錄都是帶著索引的, 而且使用這種方法後需要重建關聯, 因此此方法不適合表記錄太多或者表上的行遷移太多的情況。

方法三:重建表

(1)修改清除行遷移表的名稱;rename table_ name to table_ name_ temp;

(2)drop 所有關聯到table_ name的外來鍵限制;

(3)重建1中被rename的表;

(4)插入表中原來的資料;

(5)刪除在table_ name_ temp 上的索引和關聯其它表的外來鍵;

(6)在table_ name上建立和原來一樣的索引、主鍵和所有的外來鍵限制;

(7)重新編譯相關的儲存過程、函式和包;

(8)刪除表table_ name_ temp。

此方法重建了表、索引和關聯, 對於資料庫的儲存和效能都有提高。但是, 這種方法需要重建乙個新錶和索引, 因此資料庫要有足夠空間; 而且對於應用也會有一段時間的中斷, 中斷時間跟重建索引和關聯的多少以及表的記錄數量等因素有關。因此, 這種方法對於7 ×24小時應用要求的系統不合適。

方法四:exp/imp

(1)使用exp匯出存在有行遷移的表;

(2)然後truncate原來的表;

(3)imp匯入步驟1匯出的表;

(4)重建表上所有的索引(可選, 但是建議重建索引, 否則系統效能不高) 。

由於步驟3較慢, 而且會占用比較大的i/o, 對應用的執行效率會產生影響。此方法的最大缺點是在exp表的時候要保證該錶沒有資料的更新或者處於唯讀狀態,否則會導致部分資料的丟失。

方法五:使用move命令

(1)建立新錶空間

(2)move表到步驟1建立的表空間中

(3)重建表上的索引。

上面幾種進行資料重組清除行遷移的方法各有優缺點, 分別適用於不同的情況, 對於乙個具體問題, 我們一定要認真分析, 針對系統的特點採用不同的清除方法,儘量減少資料庫的停用時間, 以保證應用的穩定執行。

行鏈結與行遷移

行鏈結與行遷移這兩種情況下,表中的行可能對乙個資料塊來說太大了,在第一中情況下,當第一次插入的時候,行對資料塊來說太大了,這種情況下,oracle儲存資料在一系列的資料塊中 乙個或多個 行鏈結通常會在有大的行,就是行中包含long或long raw的列中,在這種情況下,行鏈結不可避免。在第二種情況下...

行遷移和行鏈結

oracle會將整行的資料遷移到乙個新的資料塊上,而將該行原先的空間只放乙個指標,指向該行的新的位置,並且該行原先空間的剩餘空間不再被資料庫使用,這些剩餘的空間我們將其稱之為空洞,這就是產生表碎片的主要原因,表碎片基本上也是不可避免的,但是我們可以將其降到乙個我們可以接受的程度。注意,即使發生了行遷...

mysql有行遷移嗎 行連線 行遷移

1.檢測行遷移和行連線 select value from v sysstat where name table fetch continued row 上面反回的是由語句訪問的鏈結行的數量。2.獲得表的鏈結行的數目 分析表 analyze table owner.table name comput...