(FAQ)辅助账余额表新增分区后分区索引无效
569次浏览
编辑于2015年03月02日 00:00:00
【问题】: (FAQ)辅助账余额表新增分区后分区索引无效
版本: 7.0.1
模块: 总账
【答复】:
原因分析: 1.由于辅助账余额表分区中包含对组织id进行hash子分区,如果新增了hash子分区或分离了子分区后,导致一个分区的数据发生分裂,而分裂的结果不管原分区的数据是否发生变化,都会导致原分区索引无效。 2.对于范围或列表分区而言,即使是SPLIT包含数据的分区,只要没有真正导致数据发生变化,就不会导致索引的失效。分区时我们会设置一个最大PMAX分区,如果将最大分区SPLIT成P2和P3两个分区,其中PMAX中的所有数据都进入P2分区,而P3分区为空,这种情况下没有数据的改变,因此所有分区索引的状态都不会变为不可用。 查看子分区状态(如为unusable则为分区索引存在问题): select index_name,status from user_ind_subpartitions where index_name='T_GL_ASSISTBALANCE的索引名' select index_name,status from user_ind_partitions where index_name='T_GL_ASSISTBALANCE的索引名' ORACLE EM监控到的表象是(辅助余额表走全表扫描,分区走的全分区): SQL语句如下: 解决方法: 1.将分区索引创建脚本进行保存。 a.打开pl/sql developer工具 b.新建一个sql window,输入t_gl_assistbalance,鼠标在表处右击鼠标,选择view: 选择下图partition页签可以看到这个表的分区情况,点击下图的view sql,查看建分区及索引的脚本: 将下图中创建的所有索引与主键约束脚本复制到txt文件中进行保存。 2.将分区索引进行删除。 a.将上面图四表中建的索引名及主键约速提取出来。 b.用以下脚本进行删除: 如主键约束名为PK_GL_ASSTBAL;其它索引名为IX_GL_PAR_ASSBALASST。 alter table T_GL_ASSISTBALANCE drop constraint PK_GL_ASSTBAL cascade; --删约束同时会把主键索引删除 drop index IX_GL_PAR_ASSBALASST; 3.用保存的建分区索引脚本执行。 现以如下脚本为例,现场需用上图四中保存的建约束、主键索引、其它索引的脚本来创建: -- Create/Recreate indexes create unique index IX_GL_PAR_ASSBALACC on T_GL_ASSISTBALANCE (FORGUNITID, FPERIODID, FACCOUNTID, FBALTYPE, FCURRENCYID, FASSISTGRPID) local; create index IX_GL_PAR_ASSBALASST on T_GL_ASSISTBALANCE (FASSISTGRPID, FORGUNITID, FPERIODID, FBALTYPE, FCURRENCYID) local; -- Create/Recreate primary, unique and foreign key constraints alter table T_GL_ASSISTBALANCE add constraint PK_P_ASSTBAL primary key (FORGUNITID, FPERIODID, FACCOUNTID, FBALTYPE, FCURRENCYID, FASSISTGRPID); 3.调优后语句执行计划如下所示(分区表走唯一索引扫描,分区不走全分区):
版本: 7.0.1
模块: 总账
【答复】:
原因分析: 1.由于辅助账余额表分区中包含对组织id进行hash子分区,如果新增了hash子分区或分离了子分区后,导致一个分区的数据发生分裂,而分裂的结果不管原分区的数据是否发生变化,都会导致原分区索引无效。 2.对于范围或列表分区而言,即使是SPLIT包含数据的分区,只要没有真正导致数据发生变化,就不会导致索引的失效。分区时我们会设置一个最大PMAX分区,如果将最大分区SPLIT成P2和P3两个分区,其中PMAX中的所有数据都进入P2分区,而P3分区为空,这种情况下没有数据的改变,因此所有分区索引的状态都不会变为不可用。 查看子分区状态(如为unusable则为分区索引存在问题): select index_name,status from user_ind_subpartitions where index_name='T_GL_ASSISTBALANCE的索引名' select index_name,status from user_ind_partitions where index_name='T_GL_ASSISTBALANCE的索引名' ORACLE EM监控到的表象是(辅助余额表走全表扫描,分区走的全分区): SQL语句如下: 解决方法: 1.将分区索引创建脚本进行保存。 a.打开pl/sql developer工具 b.新建一个sql window,输入t_gl_assistbalance,鼠标在表处右击鼠标,选择view: 选择下图partition页签可以看到这个表的分区情况,点击下图的view sql,查看建分区及索引的脚本: 将下图中创建的所有索引与主键约束脚本复制到txt文件中进行保存。 2.将分区索引进行删除。 a.将上面图四表中建的索引名及主键约速提取出来。 b.用以下脚本进行删除: 如主键约束名为PK_GL_ASSTBAL;其它索引名为IX_GL_PAR_ASSBALASST。 alter table T_GL_ASSISTBALANCE drop constraint PK_GL_ASSTBAL cascade; --删约束同时会把主键索引删除 drop index IX_GL_PAR_ASSBALASST; 3.用保存的建分区索引脚本执行。 现以如下脚本为例,现场需用上图四中保存的建约束、主键索引、其它索引的脚本来创建: -- Create/Recreate indexes create unique index IX_GL_PAR_ASSBALACC on T_GL_ASSISTBALANCE (FORGUNITID, FPERIODID, FACCOUNTID, FBALTYPE, FCURRENCYID, FASSISTGRPID) local; create index IX_GL_PAR_ASSBALASST on T_GL_ASSISTBALANCE (FASSISTGRPID, FORGUNITID, FPERIODID, FBALTYPE, FCURRENCYID) local; -- Create/Recreate primary, unique and foreign key constraints alter table T_GL_ASSISTBALANCE add constraint PK_P_ASSTBAL primary key (FORGUNITID, FPERIODID, FACCOUNTID, FBALTYPE, FCURRENCYID, FASSISTGRPID); 3.调优后语句执行计划如下所示(分区表走唯一索引扫描,分区不走全分区):
推荐阅读