首页 » ORACLE » 解决行迁移 案例

解决行迁移 案例

sql>select table_name,chain_cnt,stale_stats
from user_tab_statistics where table_name='ICME_SIMULATE_QA_STATUS';

table_name                 chain_cnt sta
-----------------------  -----------  -------
ICME_SIMULATE_QA_STATUS   501443      YES

--看出统计信息过旧

SQL> desc ICME_SIMULATE_QA_STATUS
 名称                                      是否为空? 类型
 ----------------------------------------- -------- -------------------------
 STUDENT_STATUS_ID                         NOT NULL NUMBER(38)
 IC_CODE                                   NOT NULL VARCHAR2(9)
 QA_STATUS_ID                              NOT NULL NUMBER(38)
 CREATE_TIME                               NOT NULL DATE
 ADMIN_ID                                  NOT NULL NUMBER(38)
 ORG_ID                                    NOT NULL NUMBER(38)
 YEAR_ID                                            NUMBER(38)
 QA_STATUS_REMARK                                   VARCHAR2(500)

SQL> select max(length(QA_STATUS_REMARK)) from ICME_SIMULATE_QA_STATUS;

MAX(LENGTH(QA_STATUS_REMARK))
-----------------------------
                          101

sql> alter table ICME_SIMULATE_QA_STATUS modify  QA_STATUS_REMARK  varchar2(300);
减少不必要的长度

sql>analyze table ICME_SIMULATE_QA_STATUS compute statistics;
重新分析

SQL> select table_name,num_rows,avg_space,avg_row_len,chain_cnt,stale_stats from user_tab_statistics where table_name='ICME_SIMULATE_QA_STATUS';

TABLE_NAME                       NUM_ROWS  AVG_SPACE AVG_ROW_LEN  CHAIN_CNT  STALE_STATS
------------------------------ ---------- ---------- ----------- ----------  ---------
ICME_SIMULATE_QA_STATUS           4077696        854          68     874571   NO

坐整体行长度来看不是行链接,应该是行迁移

解决方法
SQL> @?/rdbms/admin/utlchain.sql
create table CHAINED_ROWS (
             *
第 1 行出现错误:
ORA-00955: name is already used by an existing object

SQL> select * from chained_rows;
未选定行

SQL> analyze table ICME_SIMULATE_QA_STATUS list chain rows;
analyze table ICME_SIMULATE_QA_STATUS list chain rows       
第 1 行出现错误:
ORA-00905: missing keyword


SQL> analyze table ICME_SIMULATE_QA_STATUS list chained rows;
表已分析。

SQL> select count(*) from chained_rows;
  COUNT(*)
----------
    874571
    
SQL> select table_name,pct_free from user_tables where table_name='ICME_SIMULATE_QA_STATUS';
TABLE_NAME                       PCT_FREE
------------------------------ ----------
ICME_SIMULATE_QA_STATUS                10

SQL> select count(*) from ICME_SIMULATE_QA_STATUS sta where exists (select null from chained_rows chrow where sta.rowid=chrow.head_rowid);

  COUNT(*)
----------
    874571

SQL> create table ICME_SIMULATE_QA_STATUS_tmp
  2  as
  3  select * from ICME_SIMULATE_QA_STATUS sta where exists (select null from chained_rows chrow where sta.rowid=chrow.head_rowid);

表已创建。

SQL> delete from ICME_SIMULATE_QA_STATUS sta where exists (select null from chained_rows chrow where sta.rowid=chrow.head_rowid);

已删除874571行。

SQL> select count(*) from  ICME_SIMULATE_QA_STATUS_tmp;
  COUNT(*)
----------
    874571
--再确认没问题再提交
SQL> commit;
提交完成。

SQL> alter table  ICME_SIMULATE_QA_STATUS pctfree 20;
表已更改。
--对于经常更新的表可以增加 pctfree 来预留大一点的空间

SQL> insert into  ICME_SIMULATE_QA_STATUS
  2  select * from  ICME_SIMULATE_QA_STATUS_tmp;

已创建874571行。

SQL> analyze table ICME_SIMULATE_QA_STATUS compute statistics;
表已分析。

SQL> select table_name,num_rows,avg_space,avg_row_len,chain_cnt,stale_stats from user_tab_statistics where table_name='ICME_SIMULATE_QA_STATUS';
TABLE_NAME                       NUM_ROWS  AVG_SPACE AVG_ROW_LEN  CHAIN_CNT STA
------------------------------ ---------- ---------- ----------- ---------- ---
ICME_SIMULATE_QA_STATUS           4077696       1157          66          1 NO

SQL> truncate table chained_rows;
表被截断。

SQL> drop table ICME_SIMULATE_QA_STATUS_tmp purge;
表已删除。

打赏

目前这篇文章有1条评论(Rss)评论关闭。

  1. Karmen Billotti | #1
    2011-12-21 at 08:40

    It is perfect time to make some plans for the future and it is time to be happy. I’ve read this post and if I could I want to suggest you few interesting things or suggestions. Maybe you can write next articles referring to this article. I wish to read even more things about it!