2014-11-08 25 views
0

我有一个三层系统。当某些条件不可用时减少逻辑读取

  • 的跟踪/监测分贝(这是在MSSQL)
  • Web服务作为一个包装与该通信DB
  • 寡妇服务执行实际的操作

窗户服务通常每分钟向Web服务发送一次请求,以查看是否有任何要处理的内容。如果在跟踪数据库的任何记录与状态CREATED

过程被触发。

状态列有四个可能值

  • REQUESTED
  • CREATED
  • FAILED
  • 竣工

我创建该状态列的索引与在必要的细节INCLUDE列表,并且在状态为CREATED的记录中工作正常。

但是,如果Status没有创建记录,那么会导致该表中有大量逻辑读取。

当没有状态为CREATED的记录时,是否有减少逻辑读取次数的建议?

+0

检查执行计划以验证索引是否按预期使用。如果查询计划显示正在按预期使用索引,则会期望少量逻辑读取。如果您提供“CREATE TABLE”,“CREATE INDEX”和查询,它可能会有所帮助。无论如何,考虑一个过滤索引WHERE'Status ='CREATED''。 – 2014-11-08 02:53:44

回答

0

这听起来像是有很少的记录时,统计直方图确切知道在该范围内存在多少记录。当记录为零且统计数据更新时,直方图将显示字符范围,而不是精确值,并使用确实存在的值的平均分布来猜测提供的值的分布情况,以及平均分布该表中的其他值可能非常大。如果您将表定义更改为使用int来表示状态的查找表,而不是直接在表中使用varchar列,那么我将很有兴趣了解如何将这种情况反应出来。我怀疑int的直方图比varchar更适合你。我相当肯定的另一种选择是使用基于对表的行计数的“if/else”,它将直接从索引中提供,并在“else”块中,当存在没有行,“select top 0 ...”,所以它仍然返回正确的模式,但没有实际的工作。