程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 快速學會Oracle數據塊

快速學會Oracle數據塊

編輯:Oracle數據庫基礎

學習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數據塊長度。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved