學習Oracle時,你可能會遇到Oracle數據塊問題,這裡將介紹Oracle數據塊問題的解決方法,在這裡拿出來和大家分享一下。因數據庫中的數據被存放在Oracle數據塊中,因此如何分配Oracle數據塊中的空間將直接影響其存取性能。
當用update語句更新一行數據時,可能使該行的數據增加,從而使其在一個Oracle數據塊內容納不下。這時,Oracle就尋找能容納下該行的Oracle數據塊,如果能找到這樣的塊,便把該行全部存入新塊中(這稱為行移動)。如果找不到能容納該整行的Oracle數據塊,則把該行切成若干片,然後把每一片分別存放在一個Oracle數據塊中,於是這樣的行被存放在多個Oracle數據塊中,這種行稱為鏈接行。查詢一個鏈接行則需要多次I/O操作,從而產生I/O瓶頸,這將降低數據的存取性能。
解決上述問題的辦法是,使用帶list chained rows選項的analyze命令來標出表或集中那些移動或鏈接的行,並將其集中在一個輸出表中。對於這些輸出表中的鏈接行,可增加其Oracle數據塊的大小,以提高數據存取性能。
減少在已有表中的遷移和鏈接行的具體步驟如下:
(1)用analyze命令收集信息:
analyze table *** list chained rows;
(2)查詢輸出表:
select * from chained_rows where table_name='test_chain';
(3)消除遷移行:
創造與已有表有相同列的中間表來持有遷移行和鏈接行:
create table int_***
as seelct * from *** where rowid in (select head_rowid from chained_rows where table_name='***');
從已有表中刪除遷移行和鏈接行:
delete from *** where rowid in (select head_rowid from chained_rows where table_name='***');
把中間表中的行插入已有表中:
insert into *** select 8 from int_***;
撤消中間表:
drop table int_***;
(4)從輸出表中刪除第1步收集的信息:
delete from chained_rows where table_name='***';
(5)再次使用analyze命令,並查詢輸出表;
(6)在輸出表中出現的任何行是鏈接行,可增加Oracle數據塊長度。