2008年(8065)
分类: 服务器与存储
2008-05-18 12:57:38
环境
产品:DB2 UDB
产品:跨平台
版本:V8,V9
问题
当一个表正在被更新的时候,可以对其执行RUNSTATS,进行表和索引数据统计信息的收集,但根据更新操作的级别不同,得到的统计信息可能是不一致的。您可能会遇到如下的错误信息:
SQL2314W 某些统计信息处于不一致的状态。最近收集的 "<对象-1>"统计信息与现有的 "<对象-2>" 统计信息不一致。
解答
不一致的统计信息可能会导致不理想的查询计划,SQL2314W就是产生这种可能性的警告信息。您应该尝试在应用对该表的访问级别尽可能低(或者如果可能的话没有任何操作)的情况下来执行RUNSTATS命令,如尝试尽量避免在有更新操作的情况下进行RUNSTATS操作。
另外,RUNSTATS命令缺省使用的是“ALLOW WRITE ACCESS”选项,您也可以使用选项“ALLOW READ ACCESS”来执RUNSTATS,这样,在RUNSTATS执行的时候,其他操作将不能更改该表。但这个选项会对应用的并行性有影响,因为任何想要更改表的操作都会处于等待状态。为了减少表被ALLOW READ ACCESS选项的RUNSTATS锁定的时间,您可以考虑使用TABLESAMPLE选项,这个选项导致RUNSTATS对于表的部份采样数据而不是所有数据收集统计信息。对于采样数据大小的合理选择,可以在确保统计信息一致性的情况下,加快RUNSTATS的速度。
如果以上的建议都无法阻止SQL2314W警告信息的出现,而检查访问该表的应用的存取计划时发现确实存在优化器未能自动选择最优的存取计划的情况,应考虑在尽量保证RUNSTATS可获得较高存取权限的时候重新执行RUNSTATS,以便优化器重新产生最优的存取计划。不过对于因遇到SQL2314W产生的非最优的存取计划,如本应选择索引扫描,但优化器选择了表扫描的情况,也可以考虑认为地用ALTER TABLE语句将该表标记成“volatile”,以鼓励优化器选择索引扫描,而不考虑表扫描。