您的位置:首页 > 其它

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

2008-04-19 21:46 239 查看
用以下方法检测行链接

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) 将表行导入到该表中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: