快速學(xué)會Oracle數(shù)據(jù)塊
學(xué)習(xí)Oracle時,你可能會遇到Oracle數(shù)據(jù)塊問題,這里將介紹Oracle數(shù)據(jù)塊問題的解決方法,在這里拿出來和大家分享一下。因數(shù)據(jù)庫中的數(shù)據(jù)被存放在Oracle數(shù)據(jù)塊中,因此如何分配Oracle數(shù)據(jù)塊中的空間將直接影響其存取性能。
當(dāng)用update語句更新一行數(shù)據(jù)時,可能使該行的數(shù)據(jù)增加,從而使其在一個Oracle數(shù)據(jù)塊內(nèi)容納不下。這時,Oracle就尋找能容納下該行的Oracle數(shù)據(jù)塊,如果能找到這樣的塊,便把該行全部存入新塊中(這稱為行移動)。如果找不到能容納該整行的Oracle數(shù)據(jù)塊,則把該行切成若干片,然后把每一片分別存放在一個Oracle數(shù)據(jù)塊中,于是這樣的行被存放在多個Oracle數(shù)據(jù)塊中,這種行稱為鏈接行。查詢一個鏈接行則需要多次I/O操作,從而產(chǎn)生I/O瓶頸,這將降低數(shù)據(jù)的存取性能。
解決上述問題的辦法是,使用帶list chained rows選項(xiàng)的analyze命令來標(biāo)出表或集中那些移動或鏈接的行,并將其集中在一個輸出表中。對于這些輸出表中的鏈接行,可增加其Oracle數(shù)據(jù)塊的大小,以提高數(shù)據(jù)存取性能。
減少在已有表中的遷移和鏈接行的具體步驟如下:
(1)用analyze命令收集信息:
analyze table *** list chained rows;
(2)查詢輸出表:
select * from chained_rows where table_name='test_chain';
(3)消除遷移行:
創(chuàng)造與已有表有相同列的中間表來持有遷移行和鏈接行:
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)在輸出表中出現(xiàn)的任何行是鏈接行,可增加Oracle數(shù)據(jù)塊長度。
【編輯推薦】