行連線的處理方式指引
我們的資料庫的行連線已經到了一個比較嚴重的地步了,對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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- tomcat連線處理機制和執行緒模型Tomcat執行緒模型
- postgresql連線失敗如何處理SQL
- windows 處理bat連線本地mysqlWindowsBATMySql
- error的處理方式Error
- Netty是如何處理新連線接入事件的?Netty事件
- vnc遠端連線黑屏,vnc連線Linux後黑屏的處理辦法VNCLinux
- linux如何處理多連線請求?Linux
- 幾種常見的延遲執行處理方式
- 執行緒池異常處理的 5 中方式執行緒
- pymysql 處理 連線超時最好的解決方案MySql
- JDK執行緒池異常處理方式JDK執行緒
- nodejs 連線 mysql 查詢事務處理NodeJSMySql
- 資料庫連線異常處理思路資料庫
- JDBC連線批量處理資料入庫JDBC
- Sqlserver執行計劃中表的四種連線方式SQLServer
- linux中cp複製時處理軟連結的兩種方式Linux
- SAP CRM點了附件的超連結後報錯的處理方式
- 簡單總結nodejs處理tcp連線的核心流程NodeJSTCP
- 移動測試新手指引--ADB 連線裝置
- 02. x86處理器執行方式
- 多工處理方式之二:多執行緒執行緒
- 修改windows遠端桌面連線埠-批處理Windows
- 遠端連線錯誤程式碼及處理
- React 中常用的事件處理方式React事件
- Hadoop小檔案的處理方式Hadoop
- 【Ansible】Ansible 連線主機顯示報錯的處理方案
- python中多程式處理資料庫連線的問題Python資料庫
- 學習tomcat-如何建立連線,處理請求Tomcat
- 異常處理方式throws
- 當 Vue 處理陣列與處理純物件的方式一樣Vue陣列物件
- MySQL 的啟動和連線方式MySql
- SQL中的四種連線方式SQL
- HTTP代理的兩種連線方式HTTP
- PHP處理密碼的幾種方式PHP密碼
- SQLite 併發的四種處理方式SQLite
- php 與 nginx 的兩種處理方式PHPNginx
- 異常-throws的方式處理異常
- Android的事件處理——監聽介面方式Android事件