ORACLE中的行迁移/行链接

来源:互联网 发布:cisco 二层端口做acl 编辑:程序博客网 时间:2024/06/05 17:49

ORACLE中的行迁移/行链接

——使用utlchain.sql解决行迁移/行链接

 

 

一. 什么是行链接和行迁移

1.   行链接

当一条记录太大,一个数据块无法将其存储时,Oracle就会将其存储在相链接的数据块中。如果一条记录中含有数据类型如:LONG、LONG RAW、LOB,行链接则无法避免。

2.   行迁移

当一个数据块已满,而一条记录在更新后长度增加了,或者表上新增加了字段,这时Oracle就会将整个记录迁移到一个新的数据块,原先的位置存放指向新位置的指针,这就是行迁移。记录的ROWID在行迁移之后保持不变

 

二. 行迁移对数据库性能的影响

上述情况对数据库的性能是有一定影响的。系统在访问一条记录时,正常情况只需要访问1个数据块,但是当出现行链接/行迁移后,就需要访问至少2个数据块,增大了至少1倍的系统开销。

 

三. 如何找出发生行迁移/行链接的表

1. 从statspack报告中获取单位时间内发生行迁移/行链接次数的统计

Instance Activity Stats

Statistic                                      Total     per Second    per Trans

--------------------------------- ------------------ -------------- ------------

summed dirty queue length                    286,188           79.5          0.2

switch current to new buffer               2,063,694          573.3          1.1

table fetch by rowid                     125,015,159       34,726.4         69.3

table fetch continued row                    60,791           16.9          0.0

以上条目记录了oracle中发生行迁移的情况

2. 定位发生行迁移/行链接的表

SQL> select owner, table_name, tablespace_name, chain_cnt from dba_tables where chain_cnt >0;

 

OWNER                          TABLE_NAME                     TABLESPACE_NAME                 CHAIN_CNT

------------------------------ ------------------------------ ------------------------------ ----------

UNITELE                                          BB_IVPN_SHOULD_COMPLETE_T      TS_TAB_BASE                                              15

UNITELE                                           BF_ACTION_PREPAY_DETAIL_T      TS_TAB_BASE                                                 6

通过以上数据字典我们可以找到相应的表

四. 处理数据库中行迁移/行链接的方法

处理此类情况大致有如下三种方法:

*exp/imp

优点:安全性高

缺点:速度较慢,且可能影响业务

*MOVE表(alter table表名 move tablespace 表空间名 )

优点:过程简单,速度快

缺点:需要占用相同大小的空间做数据存放,可能影响业务

*使用utlchain.sql

优点:安全性高,速度快

缺点:过程较繁琐,如表中含有外键约束的话不能使用此方案。

一般我们建议选用utlchain.sql和move表的方法,下面将对过程比较复杂的使用utlchain.sql的方法进行说明,关于move表和exp/imp的方法这里不做累述。

1. 通过数据库工具脚本建立一个存放迁移行的表

SQL> @?/rdbms/admin/utlchain.sql

 

2. 分析表中迁移行的rowid

SQL> analyze table UNITELE.BB_IVPN_SHOULD_COMPLETE_T list chained rows;

 

3. 建立一个中间表来暂时存放迁移行的数据

SQL> create table CH_BB_IVPN_SHOULD_COMPLETE_T

as select * from UNITELE.BB_IVPN_SHOULD_COMPLETE_T where

rowid in (select HEAD_ROWID from CHAINED_ROWS);

 

 

4.删除原表中所有的迁移行

SQL> delete UNITELE.BB_IVPN_SHOULD_COMPLETE_T

where rowid in (select HEAD_ROWID from CHAINED_ROWS);

 

 

5.再将被删除的行从中间表中反插回去

SQL> insert into UNITELE.BB_IVPN_SHOULD_COMPLETE_T

select * from CH_BB_IVPN_SHOULD_COMPLETE_T;

 

 

6.提交修改

SQL> commit;

      

五. 总结

在update操作频繁的表中,出现行迁移/行链接情况是无法完全避免的,如果置之不理,链接行的数量与日俱增,对数据库性能的影响是可想而知的。所以,应该及时的发现并处理此类情况,保证数据库性能的稳定。

使用上述方法进行表的行迁移/行链接处理,全部都在联机的状态下完成,基本上不会对业务产生影响,有速度快、效率高的特点。

0 0
原创粉丝点击