行鏈結與行遷移這兩種情況下,表中的行可能對乙個資料塊來說太大了,在第一中情況下,當第一次插入的時候,行對資料塊來說太大了,這種情況下,oracle儲存資料在一系列的資料塊中(乙個或多個)。行鏈結通常會在有大的行,就是行中包含long或long raw的列中,在這種情況下,行鏈結不可避免。在第二種情況下,原本在乙個資料塊中的行被更新,尺寸長了,同時資料塊已經滿了,這種情況下oracle遷移整行資料到乙個新的資料塊,oracle包含原來的行piece來指向新的資料塊。遷移的資料行的rowid不變。
列出表中鏈結的行
通過使用analyze ...list chained rows可以檢視鏈結和遷移的行,結果存放到chained_rows表中,建立chained_rows表需要執行utlchain.sql或utlchn1.sql。在執行完這個指令碼後執行:
analyze table emp_dept list chained rows into chained_rows消除表遷移或表鏈結
查詢chained_rows表
select * from chained_rows where table_name='order_hist';
這表列出了遷移或是鏈結的行
建立乙個中間表與表有相同結構的來存放遷移和鏈結的行。
create table int_order_histas select *
from order_hist
where rowid in
(select head_rowid
from chained_rows
where table_name = 'order_hist');
在表中刪除遷移的或鏈結的行
delete from order_histwhere rowid in
(select head_rowid
from chained_rows
where table_name = 'order_hist');
把臨時表中的資料插回表
insert into order_histselect *
from int_order_hist;
刪除中間表
drop table int_order_history
刪除chained_rows中的內容
delete from chained_rowswhere table_name = 'order_hist';
使用analyze再次分析。表鏈結的話可以通過增大資料塊的大小來解決,通常包含long和大的char varchar2的列都無可避免的由鏈結。
行鏈結與行遷移
行遷移 行遷移一般產生在更新操作中,當更新操作導致行長增加了,而block的自由空間已經沒有,這時oracle把整行記錄遷移到乙個新的block中,並在原來block中存放新block的鏈結,行遷移產生。2.行鏈結與行遷移的檢測 1 建立chained rows表 利用oracle資料庫自身提供的指...
行遷移和行鏈結
oracle會將整行的資料遷移到乙個新的資料塊上,而將該行原先的空間只放乙個指標,指向該行的新的位置,並且該行原先空間的剩餘空間不再被資料庫使用,這些剩餘的空間我們將其稱之為空洞,這就是產生表碎片的主要原因,表碎片基本上也是不可避免的,但是我們可以將其降到乙個我們可以接受的程度。注意,即使發生了行遷...
mysql有行遷移嗎 行連線 行遷移
1.檢測行遷移和行連線 select value from v sysstat where name table fetch continued row 上面反回的是由語句訪問的鏈結行的數量。2.獲得表的鏈結行的數目 分析表 analyze table owner.table name comput...