同一查询的不同执行时间where子句中的不同值

时间:2016-09-20 07:27:32

标签: sql sybase-ase sql-execution-plan

逗人, 我运行相同的查询,它需要不同的执行时间如下: 查询是:

select * from table1 where userID = 2

它扫描非群集索引idx1,其中包含userID作为其密钥之一,因此我在5秒内得到结果。 但是当我再次使用userID = 5运行它时 它扫描非集群索引idx2,其中不包含userID作为其密钥之一,并在2小时后得到结果,我想它可能会读取整个表来查找userID = 5

这个问题的原因是什么? 也许userID = 5的值不在idx1叶子? 我认为NC索引中的叶级别存储了一系列值,查询在userID = 4和userID = 6时运行良好,因此userID = 5应该在叶级别中,

请咨询

2 个答案:

答案 0 :(得分:0)

尝试使用索引提示

用于热修复

select * from table1 with(index(idx1) where userID = 5

参考:http://blog.sqlauthority.com/2009/02/08/sql-server-introduction-to-force-index-query-hints-index-hint-part2/

长期解决方案

您可能需要更新表的统计信息或重建索引。 您可以关注此链接:Script for rebuilding and reindexing the fragmented index?

答案 1 :(得分:0)

首先更新该表索引的统计信息。 如果它不起作用并且您使用的是ASE15或+,则应更新列userID的统计信息。 ASE15优化器对统计数据比ASE12更敏感。