1、先用EXP 或者数据泵将该表的数据导出一份
Exp test/test buffer=512000000 file=d:\test.dmp tables=a
Expdp test/test directory=dump_dir dumpfile=d:\test.dp tables=a
2、登陆PL/SQL 或者TOAD 等工具软件,将表的定义截取出来,还有其上的触发器脚本,也要单独存储出来,切记!
3、登陆用户,在数据库中创建备份表,按照期望的主键顺序
SQL>create table a_lxy (如果需要更换表空间,可在此增加TABLESPACE "D_NEW")as select * from a order by code;
Table created
SQL>select count(*) from a;
SQL>select count(*) from a_lxy;
确认两者记录数相同。
4、摘除旧表,将备份表重命名为原来的表名。
Drop table a ;
alter table a_lxy rename to a;
5、增加主键约束:
SQL> ALTER TABLE "TEST"."A" add CONSTRAINT "PK_A" PRIMARY KEY("CODE") ;
Table altered
6、逐一增加其他的索引,先增加唯一性的,再增加非唯一性的
SQL>CREATE INDEX "TEST"."INX_A_SJLB" ON "TEST"."A" ("LB", "SJLB", "YXBJ") COMPUTE STATISTICS TABLESPACE "INDX" ;
Index created
.......
7、恢复触发器
用步骤2中获取的触发器脚本,恢复表上的触发器。
8、完整性约束
SQL> ALTER TABLE "TEST"."A" add CONSTRAINT "CHK_ON_CODE" CHECK ( lb='01' and length(code)=8) ENABLE;
Table altered
.......
9、字段上的缺省值
这个是比较容易忽视的问题,步骤3创建备份表时,没有带上这些缺省值的设置,这是需要注意的问题,否则会引起应用问题。
10、对表进行分析
exec dbms_stats.gather_table_stats(ownname => 'TEST', tabname =>'A', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,method_opt => 'FOR ALL INDEXED COLUMNS SIZE AUTO', cascade=> TRUE);
11、设置表的缓存:
SQL> alter table test.a CACHE;
Table altered
SQL>alter index PK_A storage (buffer_pool keep) ;
这个案例告诉我们,对于生产系统,再简单的表也要考虑细致了,有些是经过测试后,仍然可能遗漏的问题,一定要将新表的定义和旧表的定义对比一下,切记!!否则轻易不要尝试这类的操作。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7177735/viewspace-747163/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7177735/viewspace-747163/
本文详细介绍了当生产系统中的表因数据块过多、无序等原因影响性能时,对其进行重组的具体步骤。包括数据导出、创建备份表、删除旧表、重建主键和其他索引、恢复触发器等操作。

被折叠的 条评论
为什么被折叠?



