行链接发生在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.sql
Table 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 AAAVolAABAAAWOiAAA
10-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 AAAVolAABAAAWOiAAA
10-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 AAAVolAABAAAWOiAAA
10-OCT-16
SYS T_ROW_MIGRATING AAAVonAABAAAW8JAAA
10-OCT-16