行链接和行迁移的检测和防止

用以下方法检测行链接

1.  检测数据库级的行链接的影响(快速估计方法)
 

查询V$SYSSTAT试图的统计信息‘table fetch continued row’
 

Select value from v$sysstat where name = ‘table fetch continued row’;
 

上面的查询返回由该查询访问到的链接行的数量;该方法对数据库中行链接的严重性进行快速估计
 
2.  获得表的链接行的计数(到表级)
 

使用SQL的命令ANALYZE TABLE来分析表
 

Analyze table mrp.mrp_system_items computes statistics
 

分析此表将更新DBA_TABLES视图的CHAINED_CNT列, 该列有该表的链接行计数。查询DBA_TABLES将得到链接行的计数
 

Select chain_cnt from dba_tables where table_name = ‘MRP_SYSTEM_ITEMS’
 

And owner = ‘MRP’
 
3.确定表的行(到行级)
 

1> 创建CHAINED_ROW表,ORACLE提供UTLCHAIN.SQL的脚本,在ORACLE_HOME/RDBMS/ADMIN目录中。
 

2>        通过分析表来检查链接/迁移行
 

ANALYZE TABLE EMP LIST CHAINED ROWS INTO CHAINED_ROWS
 

对所有需要检查的表重复执行该步骤
 

3>   查询CHAINED_ROWS 表
 

SELECT OWNER_NAME, TABLE_NAME, HEAD_ROWID FROM CHAINED_ROWS
 
4. 怎样删除行链接
 

行链接很难消除。完全消除行连接,有必要用较大的数据块尺寸来重建数据库。
 

1. 执行一致性的全数据库导出
 

2. 删除旧的数据库
 

3. 用较大的数据块尺寸创建一个新数据库
 

4. 将数据从导出转储文件中导入到新建的数据库中
 
5.怎样删除行迁移
 

方法1 此方法在一个大表中有很少的行链接时使用。
 

1) 通过分析表并将行列入chained_rows
 

ANALYZE TABLE EMP LIST CHAINED ROWS INTO CHAINED_ROWS
 

2) 使用CREATE TABEL 。。。。。AS SELECT命令来创建一个临时表并拷贝迁移的行
 

Create table chain_tmp as
 

Select *
 

From emp
 

Where rowed in (select head_rowid from chained_rows);
 

查询临时表以确保已经备份了迁移行
 

3) 从原来的表中删除迁移的行
 

Delete from emp
 

Where rowed in (select head_rowid from chained_rows)
 

4) 将临时表的行拷贝到原来的表中
 

Insert into emp
 

Select * from chain_tmp;
 

应检查,确保行已经重新插入到表中,然后,删除chained_rows
 

5) 检查链接行,通过截取使chained-rows为空,再次分析此表来查找连接行
 

Analyze table emp
 

List chained rows into chained_rows
 

检查是否还有行被插入到chained_rows中
 

SELECT owner_name, table_name, head_rowid FROM chained_rows;
 

如果返回了行, 则说明这些行是连接行而不是迁移行
 
方法2 此方法在一个大表中有许多连接行时使用。
 

1) 导出该表的行,或者使用CREATE TABLE 。。。AS SELECT 语句将表的行拷贝到临时表中
 

2) 使用带DROP STROAGE选项的TRUNCATE命令来截取该表。如果想要增加PCTFREE,则使用带STORAGE的子句的ALTER TABLE 命令
 

3) 将表行导入到该表中

posted on 2008-04-19 21:46  afant  阅读(475)  评论(0编辑  收藏  举报

导航