Round-robin方式分片的唯一索引失效原因

数据库版本:11.50.FC9W2
业务人员反馈,使用了唯一索引的表中,存在违反唯一索引限制的重复数据

表结构节取如下:

create table "informix".tpd_msc
  (
    object_rdn varchar(255),
    ne_id integer,
    record_id integer not null ,
    scan_start_time datetime year to second not null ,
    scan_stop_time datetime year to second not null ,
.........
    setup_calls_inc float
  )
  fragment by round robin in dpmdbs01 , dpmdbs02 , dpmdbs03 , dpmdbs04 , dpmdbs05
    , dpmdbs06 , dpmdbs07 , dpmdbs08
  extent size 4000 next size 4000 lock mode row;

create unique index "informix".idx1_tpd_msc on "informix".tpd_msc
    (scan_start_time,ne_id,scan_stop_time) using btree ;

数据库中查到数据:

select ne_id scan_start_time,scan_stop_time
from tpd_msc
where ne_id = 1080239450
and scan_start_time = '2013-12-23 00:00:00';

结果:

      ne_id scan_start_time     scan_stop_time

 1080239450 2013-12-23 00:00:00 2013-12-23 00:10:00
 1080239450 2013-12-23 00:00:00 2013-12-23 00:10:00
 1080239450 2013-12-23 00:00:00 2013-12-23 00:10:00   

3 row(s) retrieved.

看起来,该查询出来的结果的确是违反了唯一性索引idx1_tpd_msc。
使用oncheck -cI DBNAME:tpd_msc 检查表索引,无异常!

尝试重建该索引,报-872错误

-872    Invalid fragment strategy or expression for the unique index.

The round-robin method cannot fragment unique indexes. If the
expression method fragments the indexes, all the columns that are used
in the fragmentation expressions must also be part of the index key.

表明使用round-robin方式的分片表时,是不允许把唯一索引进行round-robin分片的。而当前的唯一索引却是已经进行分片的!

询问业务人员,该数据库是从以前的版本中升级上来的,怀疑是原始的数据库版本中允许使用唯一索引round-robin分片,而升级到11.50.FC9W2后,已经不允许了,于是乎唯一索引的唯一性失效;或者原始的数据库版本存在该BUG(允许创建唯一索引round-robin分片)。

解决方式:
1,重建唯一索引时,指定索引存放位置为单一dbspace,而不进行round-robin分片(需要删除不符合唯一索引的记录);
2,建议使用表达式分片策略(expression method fragment)。

标签: none

添加新评论