行遷移和行鏈結

2021-08-27 06:27:31 字數 2404 閱讀 9357

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

oracle會使用與該塊鏈結的一塊或多塊資料塊來容納該行的資料。行連線經常在插入比較大的行時才會發生,如包含long, long row, lob等型別的資料。在這些情況下行鏈結是不可避免的。

讀一行要讀兩個塊,也就是要兩次邏輯讀

insert or update的效能比較差

利用索引查詢已鏈結或遷移的行的select語句的效能比較差,因為他們需要額外的i/o

sql> conn / as sysdba

connected.

sql> @?/rdbms/admin/utlchain.sql

table created.

sql> analyze table hr.departments list chained rows;

table analyzed.

sql> select * from chained_rows;

no rows selected

另外,如何獲知行遷移(行鏈結)嚴重的表呢?

dba_tables檢視的chained_cnt列,該列有該錶的鏈結行計數。

儘管行遷移與行鏈結是兩個不同的事情,但是在oracle內部,它們被當作一回事。所以當你檢測行遷移與行鏈結時,你應該仔細的分析當前你正在處理的是行遷移還是行鏈結。

o 在大多數情況下,行鏈結是無法克服的,特別是在乙個表包含象longs, lobs 等這樣的列時。當在不同的表中有大量的鏈結行,並且哪些表的行的長度不是很長時,你可以通過用更大的block size重建資料庫的方法來解決它。

例如:當前你的資料庫的資料塊的大小為4k,但是你的行的平均長度為6k,那麼你可以通過用8k大小的資料塊來重建資料庫的辦法解決行鏈結現象。

o 行遷移主要是由於設定的pctfree引數過小,導致沒有給update操作留下足夠的空閒空間引起。為了避免行遷移,所有被修改的表應該設定合適的 pctfree 值,以便在每個資料塊內為資料修改保留足夠的空間。可以通過增加pctfree值的辦法來避免行遷移,但這種解決辦法是以犧牲更多的空間為代價的,這也就是我們通常所說的以空間換效率。 而且通過增加pctfree值的辦法只能緩解行遷移現象,而不能完全解決行遷移,所以較好的辦法是在設定了合適的pctfree值的後,在發現行遷移現象比較嚴重時,對錶的資料進行重組。下面是對行遷移資料進行重組的步驟(這種方法也被成為ctas):

-- get the name of the table with migrated rows:

accept table_name prompt 'enter the name of the table with migrated rows: '

-- clean up from last execution

set echo off

drop table migrated_rows;

drop table chained_rows;

-- create the chained_rows table

@.../rdbms/admin/utlchain.sql

set echo on

spool fix_mig

-- list the chained and migrated rows

analyze table &table_name list chained rows;

-- copy the chained/migrated rows to another table

create table migrated_rows as

select orig.*

from &table_name orig, chained_rows cr

where orig.rowid = cr.head_rowid

and cr.table_name = upper('&table_name');

-- delete the chained/migrated rows from the original table

delete from &table_name where rowid in (select head_rowid from chained_rows);

-- copy the chained/migrated rows back into the original table

insert into &table_name select * from migrated_rows;

spool off

行鏈結與行遷移

行遷移 行遷移一般產生在更新操作中,當更新操作導致行長增加了,而block的自由空間已經沒有,這時oracle把整行記錄遷移到乙個新的block中,並在原來block中存放新block的鏈結,行遷移產生。2.行鏈結與行遷移的檢測 1 建立chained rows表 利用oracle資料庫自身提供的指...

行鏈結與行遷移

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

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

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