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

2021-10-17 18:18:20 字數 1443 閱讀 9223

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