行連線的處理方式指引

babyyellow發表於2022-11-15


 

 

我們的資料庫的行連線已經到了一個比較嚴重的地步了,對awr 報表的統計資料是 sunha5 花在行連線的 i/o 是平均每秒 600 次左右。

透過對產品庫和商家進行清理後,目前的統計降到了200 次左右,還有繼續下降的空間。

 

行連線的成因

行連線(chained rows) 是因為對欄位做修改後,導致修改後的資料大於原來的資料長度,在現在的行裡,已經無法儲存這個資料,寫不下的資料會被放到別的資料塊裡,並且在原行中紀錄這個地址。這樣導致的問題是,如果要讀出這個行資料, oracle 必須要進行 2 次甚至多次 i/o 操作才會把整行資料讀出來,增加了 i/o 成本,導致效能下降。

 

 Oracle 提供了工具進行行連線的檢測:

我們以商家系統的處理為例演示下:

注: 本操作為直接修改線上資料庫需要小心執行。

 

1. 在當前使用者下執行 $ORACLE_HOME/rdbms/amdin/utlchain.sql   建立一個表。

    鍵表語句:

 create table CHAINED_ROWS (

  owner_name         varchar2(30),

  table_name         varchar2(30),

  cluster_name       varchar2(30),

  partition_name     varchar2(30),

  subpartition_name  varchar2(30),

  head_rowid         rowid,

  analyze_timestamp  date

);

 

2. 對要進行分析的表執行分析命令:

analyze table  table_name  list chained rows into CHAINED_ROWS;

 select 'analyze table cyp_app.'||table_name||' list chained rows into CHAINED_ROWS;'  from  dba_tables where owNer='CYP_APP';

 

  生成商家的所有的表的分析語句然後批次執行。

這個分析命令會把表中有行連線的行的rowid 紀錄到這個表中。

Select  * from  chained_rows:

CYP_APP ENT_COMPANY_TEXT   N/A AABZKnABNAAAM5yAAJ     07-1 -09

CYP_APP ENT_COMPANY_TEXT   N/A AABZKnABNAAAM51AAU 07-1 -09

CYP_APP ENT_COMPANY_TEXT   N/A AABZKnABNAAAM53AAK 07-1 -09

CYP_APP ENT_COMPANY_TEXT   N/A AABZKnABNAAAM54AAF 07-1 -09

CYP_APP ENT_COMPANY_TEXT   N/A AABZKnABNAAAM56AAG 07-1 -09

CYP_APP ENT_COMPANY_TEXT   N/A AABZKnABNAAAM6AAAH 07-1 -09

 

3. 處理行連線的資料。先備份 ,刪除原表的資料,然後再insert

 

drop table tmp_as;

 

-- 建立臨時表。

create table  tmp_as as select a.* from  CYP_APP.ENT_QUESTION a where a.rowid in (

select head_rowid from chained_rows where table_name ='ENT_QUESTION');

 

select * from tmp_as ;

 

 

4. 對錶進行更新,刪除和insert   操作儘量爭取在一個事務裡完成。如果有外來鍵引用需要先把外來鍵引用禁用掉。

 

   Commit;

 

delete from CYP_APP.ENT_QUESTION where rowid in (

select head_rowid from chained_rows where table_name ='ENT_QUESTION');

 

 insert into  CYP_APP.ENT_QUESTION select * from tmp_as ;

 

Commit;

 

 5. chained_rows 表中刪除跟該表相關的紀錄  

 

delete from  chained_rows where table_name ='ENT_QUESTION';

 

 6. 如果表的 chained rows 比較多,比如有幾萬筆紀錄或者 10 幾萬筆紀錄,

我們因該考慮修改表的儲存引數,把pctfree 引數修改為 15 或者 20

alter table   CYP_APP.ENT_QUESTION    pctfree 15 ;

  7, 如果表的行連線比較多,到了幾萬筆的數量級,那麼對這個表的 update 說明已經進行了很多次的了,

索引估計也會比較大,浪費空間。建議對該表的索引做一個rebuild

  


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133735/viewspace-2923500/,如需轉載,請註明出處,否則將追究法律責任。

相關文章