我在数据库中有一个Task表,该表大概总共有四五万条记录,其中表已经做了以下几个索引。
聚集     列
是       TaskStartTime,TaskFinishTime  (日期型字段)
否       TaskId                         (int型字段)
否       TaskProject                    (int型字段)
否       Status                         (int型字段)问题:
当执行select  TaskId from task where taskproject=9时执行时间大约需要五秒,记录总数大概是六千多条而当把taskproject=9改成任何其它类别数值,比如0时,都在0秒钟,而且数据总量为三万条左右。而当把第一条语句的select TaskId 改为 select * 时,查询时间也是0秒钟.此后为解决此问题,采用多种方式来尝试:
1、采用select top 的方式,发现在select top 4272条记录时,查询速度正常,而select top 4273以及之后的记录时,速度便不正常了。于是便想定位到4273这条记录,想查看该记录是否数据异常,但对比发现top 4272时查询的结果居然和top 4273时不同,top 4272以及小于4272时的结果排序是乱的,而4273以及大于4273的结果确是按倒序来排列的,这样也就找不出来哪条记录是想要的。于是改采用order by taskid desc的强制排序的方式来查询,新问题又出来了:只要select top 大于100条记录,都非常慢.没办法,采用别的字段排序,选择了createDate这个创建时间来排序,但结果更让我惊讶,不管怎么查询,采用这个排序的方式,都不会出现慢的问题了。
不知道我表述的清不清楚,问题看来暂时可以采用order by createdate的方式来解决,但这个问题产生的原因是什么?