行連線的處理方式指引
我們的資料庫的行連線已經到了一個比較嚴重的地步了,對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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle優化器內部處理的表連線方式Oracle優化
- 處理方塊之間的連線線
- 一次對連線過程進行跟蹤處理連線故障問題的案例
- tomcat連線處理機制和執行緒模型Tomcat執行緒模型
- postgresql連線失敗如何處理SQL
- windows 處理bat連線本地mysqlWindowsBATMySql
- mysql 的連線方式MySql
- error的處理方式Error
- sql server連線排序衝突處理SQLServer排序
- SSH 連線緩慢問題處理
- asp連線Mysql及編碼處理MySql
- 多表連線SQL優化如何處理SQL優化
- Oracle資料庫關於錶行連線和行遷移處理方案Oracle資料庫
- vnc遠端連線黑屏,vnc連線Linux後黑屏的處理辦法VNCLinux
- ORACLE 連線方式Oracle
- Oracle連線方式Oracle
- Netty是如何處理新連線接入事件的?Netty事件
- pymysql 處理 連線超時最好的解決方案MySql
- mysql自動斷開連線的問題處理MySql
- 上下居中的處理方式
- 引號的處理方式
- linux如何處理多連線請求?Linux
- JDBC連線批量處理資料入庫JDBC
- 資料庫連線異常處理思路資料庫
- Sqlserver執行計劃中表的四種連線方式SQLServer
- 幾種常見的延遲執行處理方式
- java中多執行緒併發的處理方式Java執行緒
- oracle行連結的檢測和處理(轉)Oracle
- JDK執行緒池異常處理方式JDK執行緒
- Django執行方式及處理流程總結Django
- Oracle 的 hash join連線方式Oracle
- 【執行計劃】資料訪問方式,連線方式及方法
- Outlook2010POP3方式連線Hotmail等郵箱的錯誤處理AI
- 移動測試新手指引--ADB 連線裝置
- 修改windows遠端桌面連線埠-批處理Windows
- 遠端連線錯誤程式碼及處理
- nodejs 連線 mysql 查詢事務處理NodeJSMySql
- 死連線_linux_OS處理機制Linux