消除行迁移

1.我们需要创建一个表叫,helei的表。把表放在system表空间里,,查看一下pctfree,pctused的值是多少。

SQL> create tablescott.helei tablespace system as select * from scott.emp;
 
truncatetable scott.helei;
 
SQL> selecttable_name,tablespace_name,blocks,pct_free,pct_used from dba_tables wheretable_name='HELEI';
 
TABLE_NAME                      TABLESPACE_NAME                          BLOCKS  PCT_FREE   PCT_USED
------------------------------------------------------------ ---------- ---------- ----------
HELEI                              SYSTEM                                               10            40

2.然后我们把pctfree设置为0

 

SQL> alter table scott.helei pctfree 0;

 

3.这时我们向表中插入数据。

SQL> insert intoscott.helei select * from scott.helei;
 
14 rows created.
 
SQL> /
 
28 rows created.
 
SQL> /
 
56 rows created.
 
SQL> /
 
112 rows created.
 
SQL> /
 
224 rows created.
 
SQL> /
 
448 rows created.
 
SQL> /
 
896 rows created.
 
SQL> /
 
1792 rows created.
 
SQL> /
 
3584 rows created.

4.这时我们表,进行更新,这样才会产生行迁移的状况。

SQL> updatescott.helei set comm=10000,job='hhhhh',ename='hhhhh';
 
7168 rows updated.
 
SQL> commit;
 
Commit complete.

5.我们分析一下这个表

SQL> analyzetable scott.helei compute statistics;
 
Table analyzed.

 

6.这时,我们可以产看一下这个表有没有发生行迁移的情况。

SQL> selecttable_name,tablespace_name,num_rows,avg_row_len,chain_cnt from dba_tables wheretable_name='HELEI';
 
TABLE_NAME                      TABLESPACE_NAME                        NUM_ROWSAVG_ROW_LEN  CHAIN_CNT
------------------------------------------------------------ ---------- ----------- ----------
HELEI                              SYSTEM                                   7168         40              3

可以看到CHAIN_CNT的列不是0,而是3说明存在行迁移,CHAIN_CNT是行链接和行迁移的总值。也就是表示3里面会有行链接或者行迁移,当然。我们这里肯定不存在行链接因为,这时我们故意制造出来的行迁移的实验。

 

解决办法;

1.我们首先在数据库中。跑一个脚本。跑完脚本以后,我们可以查看跑完脚本以后自动创建了一个叫chained_rows表。

SQL>@?/rdbms/admin/utlchain
 
Tablecreated.
 
SQL>select count(*) from chained_rows;           
 
  COUNT(*)
----------
 0

2.这时我们把发生,发生行迁移的数据库放到chained_rows表当中。

SQL>analyze table scott.helei list chained rows into chained_rows;
 
Tableanalyzed.

3.然后我们查看一下chained_rows这个表。可以看到许多数据库。因为他们都是行迁移的数据库。

SQL>select * from chained_rows;
 
OWNER_NAME                      TABLE_NAME                     CLUSTER_NAME                     PARTITION_NAME       SUBPARTITION_NAME                  HEAD_ROWID              ANALYZE_TIME
------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------ ------------
SCOTT                              HELEI                                                                                   N/A                           AAASNcAABAAAVCYAAA 17-JAN-16
SCOTT                              HELEI                                                                                   N/A                           AAASNcAABAAAVCjAAA 17-JAN-16
SCOTT                              HELEI                                                                                   N/A                           AAASNcAABAAAVCuAAA 17-JAN-16

 

4.这时,我们创建一张表叫helei_bak并且把发生行迁移的数据都插入到helei_bak.

SQL>  create table scott.helei_bak as select * fromscott.helei where rowid in (select head_rowid from chained_rows);
 
Tablecreated.
 
SQL>select count(*) from scott.helei_bak;
 
  COUNT(*)
----------
 3

5.我们把原来表中,发生行迁移的数据全部删除掉。

SQL>delete from scott.helei where rowid in (select head_rowid from chained_rows);
 
3 rowsdeleted.
 
SQL>commit;
 
Commitcomplete.

6.我们再把helei_bak的数据在插入到原来的helei表当中。

SQL>insert into scott.helei select * from scott.helei_bak;
 
3 rowscreated.
 
SQL>commit;
 
Commitcomplete.

7.最后。我们在分析helei,然后在查看一下,还有没有行迁移了。

SQL>analyze table scott.helei compute statistics;
 
Tableanalyzed.
 
SQL>select table_name,tablespace_name,num_rows,avg_row_len,chain_cnt,pct_free fromdba_tables where table_name ='HELEI';
 
TABLE_NAME                      TABLESPACE_NAME                        NUM_ROWSAVG_ROW_LEN  CHAIN_CNT   PCT_FREE
------------------------------------------------------------ ---------- ----------- ---------- ----------
HELEI

8.最后我们看到helei这个表的chain_cnt已经为0了,这代表这个表没有行迁移或者行链接的情况了。问题决绝了。






总结:
检查行迁移的方法:
1) 运行$ORACLE_HOME/rdbms/admin/utlchain.sql
2)analyze table table_name list chained rows into CHAINED_ROWS
3) select * from CHAINED_ROWS where table_name='table_name';
清除的方法:
方法1:create table table_name_tmp as select * from table_name where rowed in (select head_rowid from chained_rows);
Delete from table_name where rowed in (select head_rowid from chained_rows);
Insert into table_name select * from table_name_tmp;
方法2:create table table_name_tmp  as select * from table_name ;
truncate table table_name
insert into table_name select * from table_name_tmp
方法3:用exp工具导出表,然后删除这个表,最后用imp工具导入这表
方法4:alter table table_name move tablespace tablespace_name,然后再重新表的索引
上面的4种方法可以用以消除已经存在的行迁移现象,但是行迁移的产生很多情况下时由于PCT_FREE参数设置的太小所导致,所以需要调整PCT_FREE参数的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值