SQL2005 
表SIS_PaValue,大概3千万数据,Id为聚集索引,Recorddate为索引(datetime类型)查询SQL语句为
SELECT     TOP 20 Id, NoteCode, [Value], RecordDate, Status
FROM         SIS_PaValue
WHERE     (RecordDate >= '2010-07-01')
ORDER BY Id DESC查询时间为16秒左右
如果把Order By Id Desc去掉,则时间为20毫秒为什么2者差别这么大,Id已经是聚集索引,为什么order by还这么耗时?另:或者把where条件去掉,留下order by,时间为15毫秒

解决方案 »

  1.   

    set rowcount=20
    SELECT  Id, NoteCode, [Value], RecordDate, Status
    FROM SIS_PaValue
    WHERE (RecordDate >= '2010-07-01')
    ORDER BY Id DESC
      

  2.   

    SELECT TOP 20 Id, NoteCode, [Value], RecordDate, Status
    FROM SIS_PaValue
    WHERE (RecordDate >= '2010-07-01')
    ORDER BY Id DESC如果不带ORDER BY,则是符合WHERE条件的任意20条记录,即通过索引查找任意20条记录即可。
    如果带ORDER BY,则是所有符合WHERE条件的记录中,按Id逆序的前20条,即通过索引查找到所有记录,再按聚集索引顺序输出。
      

  3.   

    TO jwdream2008语句报错,我查了下后把它改为set rowcount 20
    我用这方法去查,不知道为什么很慢,1分多钟后还不出结果,我取消了查询
    去掉order by后 结果瞬间就出来了
      

  4.   


    按聚集索引排序不是应该很快的吗?这为什么会慢..
    如果没有where条件,order by id 查询一下子就出来了;
    或者是保留where条件,去掉order by 查询野一下子就出来了弄得我头都大了..
      

  5.   

    RecordDate 不能直接找到NoteCode,Status,Value的数据,使用seek找到ID,ID再找到数据
    之后再排序,所以慢。如果没有where条件,order by id 查询一下子就出来了;
    此时使用ID 的 clustered index 所以快,因为他已经是排序的了。或者是保留where条件,去掉order by 查询野一下子就出来了
    不用order by 只从where 条件中取出20条就返回结果,所以快。
      

  6.   

    不知道你的表是怎么设计的。 如果是我想象的,可以使用RecordDate 查出最小IDselect min(id) from tab where RecordDate >''select top 10 * from tab where id > min(id) order by id desc (asc)
      

  7.   

    To dla001你的意思你where条件查询出来后 id已经不是索引,所以order by慢,是这意思不?那这种情况下怎么提速?
      

  8.   


    可以使用这种方式的话就可以提速,如果不能,要你的index包含你要查询的所有的字段,会快多少不知道。