行链接发生在INSERT阶段数据块无法容纳过大数据时,行迁移发生在UPDATE阶段时原数据块无法容纳增大的数据时。
因为需要扫描更多的数据块才能得到所需的信息,所以行链接和行迁移会导致系统的查询效率降低。行迁移和行链接都会导致oracle性能下降。
例一行链接:
①创建测试表 SQL> create table t_row_chaining (x char(2000),y char(2000),z char(2000),q char(2000));Table created.②插入初始数据SQL> insert into t_row_chaining values('a','b','c','d');1 row created.SQL> commit;Commit complete.③使用ANALYZE命令对表t_row_chaining进行分析,以便验证该表是否发生了行链接。
SQL> ANALYZE TABLE t_row_chaining LIST CHAINED ROWS;ANALYZE TABLE t_row_chaining LIST CHAINED ROWS*ERROR at line 1:ORA-01495: specified chain row table not found(原因是CHAINED_ROWS表没有创建导致)
④使用Oracle自带的utlchain.sql脚本创建CHAINED_ROWS表,并再次分析表
SQL> @?/rdbms/admin/utlchain.sqlTable created.SQL> ANALYZE TABLE t_row_chaining LIST CHAINED ROWS;Table analyzed.⑤测试行链接,由于初始化的数据无法在一个数据块中存放(因为测试表所有字段都为char类型所致),此时发生了行链接。
SQL> select owner_name,table_name,head_rowid,analyze_timestamp from chained_rows;OWNER_NAME TABLE_NAME HEAD_ROWID------------------------------ ------------------------------ ------------------ANALYZE_T---------SYS T_ROW_CHAINING AAAVolAABAAAWOiAAA10-OCT-16
例二行迁移:
①创建测试表 SQL> create table t_row_migrating (x varchar2(2000),y varchar2(2000),z varchar2(2000),q varchar2(2000));Table created.
②插入初始化数据
SQL> insert into t_row_migrating values('a','b','c','d');1 row created.SQL> commit;Commit complete. ③此时由于是VARCHAR2类型的字段(此类型字段可以自适应数据的长短),此时数据完全可以在一个数据块中存放,因此此时不会发生行链接。分析表t_row_migrating,并验证是否存在行链接。
SQL> ANALYZE TABLE t_row_migrating LIST CHAINED ROWS;Table analyzed.SQL> select owner_name,table_name,head_rowid,analyze_timestamp from chained_rows;(还是刚才测试行链接时的记录)OWNER_NAME TABLE_NAME HEAD_ROWID------------------------------ ------------------------------ ------------------ANALYZE_T---------SYS T_ROW_CHAINING AAAVolAABAAAWOiAAA10-OCT-16④我们使用t_row_chaining中的大数据对表t_row_migrating进行更新,使之发生行迁移。
SQL> update t_row_migrating set (x,y,z,q)=(select * from t_row_chaining);1 row updated.SQL> commit;Commit complete.⑤对表t_row_migrating进行分析,并验证行链接
SQL> ANALYZE TABLE t_row_migrating LIST CHAINED ROWS;Table analyzed.SQL> select owner_name,table_name,head_rowid,analyze_timestamp from chained_rows;OWNER_NAME TABLE_NAME HEAD_ROWID------------------------------ ------------------------------ ------------------ANALYZE_T---------SYS T_ROW_CHAINING AAAVolAABAAAWOiAAA10-OCT-16SYS T_ROW_MIGRATING AAAVonAABAAAW8JAAA10-OCT-16