行链接和行迁移案例
两则之间的区别:
行链接是指一个行存储在多个块中的情况,因为一个该行的长度超过了一个块的可用空间大小。(Insert)
行迁移是指一个数据行不适合放入当前块而被重新定位到另一个块,但在原始块中保留一个指针,原始块中的指针是必需的,因为索引的rowid项仍然指向原始位置.(update)行链接通常与行的长度和oracle数据库块中的大小有关,而行迁移通常是当一个更新操作的长度增加且又要保持该行在同一块中,而该块又缺少可用空间时产生的问题,oracle在决定行连接之前先试图进行行迁移。
行连接
1、建立表 04:50:36 SQL> show user;USER is "SCOTT"04:50:39 SQL> create table t_row_chaining (x char(2000), y char(2000), z char(2000), q char(2000));Table created.
04:50:51 SQL> insert into t_row_chaining values('x','y','z','q');
1 row created.
04:51:05 SQL> commit;
Commit complete.
2、执行脚本,建立行链接和行迁移视图
04:51:10 SQL> @?/rdbms/admin/utlchain.sql
Table created.
04:51:32 SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------DEPT TABLEEMP TABLEBONUS TABLESALGRADE TABLEEMP1 TABLEEMP5 TABLESALES TABLESYS_IOT_OVER_12021 TABLESALES_INFO TABLEDEPT_EMP_CLU CLUSTERDEPARTMENT TABLE 1EMPLOYEE TABLE 2TMP1 TABLETMP2 TABLET_ROW_CHAINING TABLECHAINED_ROWS TABLE16 rows selected.
04:51:40 SQL> desc CHAINED_ROWS
Name Null? Type ----------------------------------------------------------------------------------- -------- -------------------------------------------------------- OWNER_NAME VARCHAR2(30) TABLE_NAME VARCHAR2(30) CLUSTER_NAME VARCHAR2(30) PARTITION_NAME VARCHAR2(30) SUBPARTITION_NAME VARCHAR2(30) HEAD_ROWID ROWID ANALYZE_TIMESTAMP 3、分析表的行链接信息 DATE04:51:50 SQL> ANALYZE TABLE t_row_chaining LIST CHAINED ROWS;
Table analyzed.
04:52:09 SQL>
04:52:09 SQL> select OWNER_NAME,TABLE_NAME,HEAD_ROWID,ANALYZE_TIMESTAMP from chained_rows;
OWNER_NAME TABLE_NAME HEAD_ROWID ANALYZE_T
------------------------------ ------------------------------ ------------------ ---------SCOTT T_ROW_CHAINING AAAC9KAAEAAAAB3AAA 25-MAR-12-------由于插入的记录长度超过了block的free space ,发生行链接
行迁移1、建立表
04:53:06 SQL> create table t_row_migrating (x varchar2(2000), y varchar2(2000), z varchar2(2000), q varchar2(2000));
Table created.
04:54:01 SQL> insert into t_row_migrating values ('x','y','z','q');
1 row created.
04:54:12 SQL> commit;
Commit complete.
04:54:20 SQL> delete chained_rows;
1 row deleted.
04:54:42 SQL> ANALYZE TABLE t_row_migrating LIST CHAINED ROWS;
Table analyzed.
04:54:54 SQL> select OWNER_NAME,TABLE_NAME,HEAD_ROWID,ANALYZE_TIMESTAMP from chained_rows;
no rows selected
2、对表做update 实验04:55:03 SQL> update t_row_migrating set (x,y,z,q)=(select * from t_row_chaining);
1 row updated.
04:57:17 SQL> commit;
Commit complete.
04:57:33 SQL> ANALYZE TABLE t_row_migrating LIST CHAINED ROWS;
Table analyzed.
04:57:41 SQL> select OWNER_NAME,TABLE_NAME,HEAD_ROWID,ANALYZE_TIMESTAMP from chained_rows;
OWNER_NAME TABLE_NAME HEAD_ROWID ANALYZE_T
------------------------------ ------------------------------ ------------------ ---------SCOTT T_ROW_MIGRATING AAAC9MAAEAAAACGAAA 25-MAR-1204:57:53 SQL>
no rows selected
04:55:03 SQL>
----------更新后的记录变长,在block free space 无法存放,发生行迁移