此文章也是对问题 [在不重建的情况下插入索引Inserting an index without reconstruction](http://%E5%9C%A8%E4%B8%8D%E9%87%8D%E5%BB%BA%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E6%8F%92%E5%85%A5%E7%B4%A2%E5%BC%95Inserting%20an%20index%20without%20reconstruction) 的一种解释 在使用SQL语言对 InterSystems IRIS 中的表进行查询时,有时候会发现返回的结果与实际有出入,特别是使用count() 函数,或者select 查询时,返回的结果少于实际应返回的值。 这种情况往往是由于数据表格的索引值出了问题。 索引出问题的主要原因可能是: * 表中先有数据,后创建的索引定义,并且定义之后没有重新生成索引。 * 对保存数据的global直接操作。如果是使用对象或者sql的方式操作数据,相应的索引都会自动更新,但是如果直接对global操作,则不会自动更新索引。 * 对保存索引的global直接操作。 要解决或者要检查是不是索引引发的问题,可以使用%ValidateIndices()函数,它有两种方式使用 $SYSTEM.OBJ.ValidateIndices(classname,idxList,autoCorrect,lockOption,multiProcess) 或者 ##class(classname).%ValidateIndices(idxList,autoCorrect,lockOption,multiProcess) 两种使用方法最大的差别是:$SYSTEM.OBJ.ValidateIndices()方法会同时检查继承于该表的子表的索引,而##class(classname).%ValidateIndices()不检查子表的索引。 函数参数:          idxList, ""代表检查所有索引,或者设定检查的索引项。默认为检查所有索引。          autoCorrect, 是否自动纠正错误。默认为0,不自动纠正。          lockOption, 执行过程中执行的锁的操作,0 - 完全不进行锁定 1 - 在检查每一行时进行共享锁定 2 - 对整个表进行独占锁定。默认=1          multiProcess, 在允许的情况下使用多进程执行。$SYSTEM.OBJ.ValidateIndices() 默认为 0,##class(classname).%ValidateIndices() 默认为 1. 例子: Do $SYSTEM.OBJ.ValidateIndices("Sample.Company",$lb("NameIdx"),1,1)  Do ##class(Sample.Company).%ValidateIndices()