1.檢測行遷移和行連線
select value from v$sysstat where name='table fetch continued row';
上面反回的是由語句訪問的鏈結行的數量。
2.獲得表的鏈結行的數目;
分析表:
analyze table owner.table_name compute;
select chain_cnt from dba_tables where table_name ='' and owner=owner_name;
3.1 建立chained_rows表,oracle提供了乙個稱為utlchain.sql 的指令碼。該指令碼放在oracle_home/rdbms/admin下:
3.2 分析要檢查行連線和行遷移的表:
analyze table table_name list chained rows into chained_rows;
3.3 查詢chained_rows表:
select owner_name,table_name,head_rowid from chained_rows;
4.消除行連線
行連線很難消除,為了完全消除行連線,可能需要用較大的資料塊尺寸重新建立資料庫。
涉及以下步驟:
4.1。執行一致的全庫匯出。
4.2.刪除舊資料庫。
4.3.用較大的資料塊尺寸建立新資料庫。
4.4 從匯出的轉儲檔案中將資料匯入新建立的資料庫中。
5.消除行遷移
5.1 方法1(當大型表中有相對較少的行遷移時可用)
a,首先通過分析表並將鏈結行和遷移行列入chained_row表來標識這些行。
analyze table scott.emp list chained rows into chained_rows;
b,使用create table ... as select 語句建立乙個臨時表並備份遷移行。
create table chain_temp as
select * from scott.emp
where rowid in(select head_rowid
from chained_rows);
注意:查詢臨時表以確保遷移行已經備份
select count(*) from chain_temp;
c,從原來的表中刪除這些遷移行(先前被標識的)
delete from scott.emp
where rowid in(select head_rowid
from chained_rows);
d:從臨時表中將這些行重新插入到原來的表中
insert into scott.emp select * from chain_tmp;
檢查以確保這些行已經重新插入到表中,然後可以刪除chain_tmp表。
drop table chain_tmp;
行鏈結與行遷移
行遷移 行遷移一般產生在更新操作中,當更新操作導致行長增加了,而block的自由空間已經沒有,這時oracle把整行記錄遷移到乙個新的block中,並在原來block中存放新block的鏈結,行遷移產生。2.行鏈結與行遷移的檢測 1 建立chained rows表 利用oracle資料庫自身提供的指...
行鏈結與行遷移
行鏈結與行遷移這兩種情況下,表中的行可能對乙個資料塊來說太大了,在第一中情況下,當第一次插入的時候,行對資料塊來說太大了,這種情況下,oracle儲存資料在一系列的資料塊中 乙個或多個 行鏈結通常會在有大的行,就是行中包含long或long raw的列中,在這種情況下,行鏈結不可避免。在第二種情況下...
行遷移和行鏈結
oracle會將整行的資料遷移到乙個新的資料塊上,而將該行原先的空間只放乙個指標,指向該行的新的位置,並且該行原先空間的剩餘空間不再被資料庫使用,這些剩餘的空間我們將其稱之為空洞,這就是產生表碎片的主要原因,表碎片基本上也是不可避免的,但是我們可以將其降到乙個我們可以接受的程度。注意,即使發生了行遷...