行迁移与行链接对于dml的影响:
无论是行迁移还是行链接,由于一行跨多个block,则同一个事务本来修改一行时只需要对一个block申请ITL,但是由于该现象的存在,一行要对多个block申请ITL,导致了高并发事务时对于ITL waits竞争的几率变大。
问题的检测和消除:
1.执行$ORACLE_HOME/rdbms/admin目录下的utlchain.sql脚本创建chained_rows表。
@$ORACLE_HOME/rdbms/admin/utlchain.sql
2.将存在有行迁移的表(用table_name代替)中的产生行迁移的行的rowid放入到chained_rows表中。
ANALYZE TABLE table_name LIST CHAINED ROWS INTO chained_rows;
3.将表中的行迁移的row id放入临时表中保存。
CREATE TABLE table_name_temp ASSELECT * FROM table_nameWHERE rowid IN(SELECT head_rowid FROM chained_rowsWHERE table_name = 'table_name');
4.删除原来表中存在的行迁移的记录行。
DELETE table_nameWHERE rowid IN(SELECT head_rowidFROM chained_rowsWHERE table_name = 'table_name');
5.从临时表中取出并重新插入那些被删除了的数据到原来的表中,并删除临时表。
INSERT INTO table_name SELECT * FROM table_name_temp;DROP TABLE table_name_temp;
对于这种传统的清除RM的方法,优点是执行起来过程比较简单,容易实现。但是这种算法的缺陷是没有考虑到表关联的情况,在大多数数据库中很多表都是和别的表之间有表关联的,有外键的限制,这样就造成在步骤3中根本无法delete掉存在有行迁移的记录行,所以这种方法能够适用的表的范围是有限的,只能适用于表上无任何外键关联的表。由于这种方法在插入和删除数据的时候都没有disable掉索引,这样导致主要消耗时间是在删除和插入时维持索引树的均衡上了,这个对于如果记录数不多的情况时间上还比较短,但是如果对于记录数很多的表这个所消耗的时间就不是能够接受的了。显然,这种方法在处理大数据量的表的时候显然是不可取的。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22818880/viewspace-2077104/
,如需转载,请注明出处,否则将追究法律责任。