行遷移和行連結的檢測
透過前面的介紹我們知道,行連結主要是由於資料庫的db_block_size不夠大,對於一些大的欄位沒法在一個block中儲存下,從而產生了 行連結。對於行連結我們除了增大db_block_size之外沒有別的任何辦法去避免,但是因為資料庫建立後db_block_size是不可改變的 (在9i之前),對於Oracle9i的資料庫我們可以對不同的表空間指定不同的db_block_size,因此行連結的產生幾乎是不可避免的,也沒有 太多可以調整的地方。行遷移則主要是由於更新表的時候,由於表的pctfree引數設定太小,導致block中沒有足夠的空間去容納更新後的記錄,從而產 生了行遷移。對於行遷移來說就非常有調整的必要了,因為這個是可以調整和控制清除的。
如何檢測資料庫中存在有了行遷移和行連結呢?我們可以利用Oracle資料庫自身提供的指令碼 utlchain.sql(在$ORACLE_HOME/rdbms/admin目錄下)生成chained_rows表,然後利用ANALYZE TABLE table_name LIST CHAINED ROWS INTO chained_rows命令逐個分析表,將分析的結果存入chained_rows表中。從utlchain.sql指令碼中我們看到 chained_rows的建表指令碼,對於分割槽表,cluster表都是適用的。然後可以使用拼湊語句的辦法生成分析所需要的表的指令碼,並執行指令碼將具體 的分析資料放入Chained_rows表中,例如下面是分析一個使用者下所有表的指令碼:
|
然後查詢chained_rows表,可以具體檢視某張表上有多少的行連結和行遷移。
|
當然,也可以查詢v$sysstat檢視中的’table fetch continued row’列得到當前的行連結和行遷移數量。
|
可以使用如下的指令碼來直接查詢存在有行連結和行遷移的表,自動完成所有的分析和統計。
[@more@]accept owner prompt " Enter the schema name
to check for Row Chaining (RETURN for All): "
prompt
prompt
accept table prompt " Enter the table name
to check (RETURN for All tables owned by &owner): "
prompt
prompt
set head off serverout on term on feed off veri off echo off
!clear
prompt
declare
v_owner varchar2(30);
v_table varchar2(30);
v_chains number;
v_rows number;
v_count number := 0;
sql_stmt varchar2(100);
dynamicCursor INTEGER;
dummy INTEGER;
cursor chains is
select count(*) from chained_rows;
cursor analyze is
select owner, table_name
from sys.dba_tables
where owner like upper('%&owner%')
and table_name like upper('%&table%')
order by table_name;
begin
dbms_output.enable(64000);
open analyze;
fetch analyze into v_owner, v_table;
while analyze%FOUND loop
dynamicCursor := dbms_sql.open_cursor;
sql_stmt := 'analyze table '||v_owner
||'.'||v_table||' list chained rows into chained_rows';
dbms_sql.parse(dynamicCursor, sql_stmt, dbms_sql.native);
dummy := dbms_sql.execute(dynamicCursor);
dbms_sql.close_cursor(dynamicCursor);
open chains;
fetch chains into v_chains;
if (v_chains != 0) then
if (v_count = 0) then
dbms_output.put_line(CHR(9)||CHR(9)||CHR(9)
||'<<<<< Chained Rows Found >>>>>');
v_count := 1;
end if;
dynamicCursor := dbms_sql.open_cursor;
sql_stmt := 'Select count(*) v_rows'||' From '||v_owner||'.'||v_table;
dbms_sql.parse(dynamicCursor, sql_stmt, dbms_sql.native);
dbms_sql.DEFINE_COLUMN(dynamicCursor, 1, v_rows);
dummy := dbms_sql.execute(dynamicCursor);
dummy := dbms_sql.fetch_rows(dynamicCursor);
dbms_sql.COLUMN_VALUE(dynamicCursor, 1, v_rows);
dbms_sql.close_cursor(dynamicCursor);
dbms_output.put_line(v_owner||'.'||v_table);
dbms_output.put_line(CHR(9)||'---> Has '
||v_chains||' Chained Rows and '||v_rows||' Num_Rows in it!');
dynamicCursor := dbms_sql.open_cursor;
sql_stmt := 'truncate table chained_rows';
dbms_sql.parse(dynamicCursor, sql_stmt, dbms_sql.native);
dummy := dbms_sql.execute(dynamicCursor);
dbms_sql.close_cursor(dynamicCursor);
v_chains := 0;
end if;
close chains;
fetch analyze into v_owner, v_table;
end loop;
if (v_count = 0) then
dbms_output.put_line('No Chained Rows found
in the '||v_owner||' owned Tables!');
end if;
close analyze;
end;
/
set feed on head on
prompt
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9907339/viewspace-1054894/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 行遷移 & 行連結的檢測與消除Oracle
- Oracle中行遷移和行連結的清除及檢測Oracle
- 行遷移和行連結
- 清除行遷移和行連結
- 如何消除行連結和行遷移
- 排除表中的行連結和行遷移
- 關於行連結和行遷移和消除
- 模擬Oracle行遷移和行連結Oracle
- 行遷移_行連結的介紹
- 【效能優化】消除行連結和行遷移的思路和方法優化
- Row Migration and Row Chaining(行遷移和行連結)AI
- 【效能最佳化】消除行連結和行遷移的思路和方法
- pctused, pctfree, pctincrease , 行遷移 & 行連結
- 【概念】行連結和行遷移的概念、模擬及甄別
- 【轉】【效能最佳化】消除行連結和行遷移的思路和方法
- 【備份恢復】行遷移與行連結
- 【轉載】行遷移和行連結(row chaining or row migration)AI
- oracle行連結的檢測和處理(轉)Oracle
- 行遷移測試
- 行連結(Row chaining)和行遷移(Row Migration)的讀書筆記AI筆記
- Oracle資料庫中資料行遷移與行連結Oracle資料庫
- 簡單瞭解 oracle update 原理(測試)、 行遷移/行連結基本認識Oracle
- 行遷移檢測及解決一例
- 行連結與行遷移, LOB欄位的儲存及效能影響
- [20160726]行連結行遷移與ITL槽.txt
- 關於Oracle資料庫中行遷移/行連結的問題Oracle資料庫
- [20160729]行連結行遷移與ITL槽4.txt
- [20160727]行連結行遷移與ITL槽2.txt
- [20160728]]行連結行遷移與ITL槽3.txt
- Oracle資料庫關於錶行連線和行遷移處理方案Oracle資料庫
- [20180402]行連結行遷移與ITL槽6.txt
- 高水位線、行遷移行連結
- 查詢行遷移及消除行遷移(chained rows)AI
- 行遷移測試實驗(轉載)
- [20121116]通過bbed觀察行連結與行遷移.txt
- oracle11g_如何模擬產生行連結或行遷移chained_rowsOracleAI
- 清除行遷移的例子
- 行遷移(鏈化行)問題