SELECT top(10) A.ClientId,A.InvStatus, A.OnCurrent, A.ModifyDate ,A.InstallDate as InstallDate2 
FROM II_InstallSW A 
WHERE  A.ModifyDate >= '2009-05-11 00:00:00' AND A.ModifyDate <= '2009-08-11 23:59:59' 
order by InstallDate2 asc 数据量 600~1000万左右。由于检索需要现有索引3个
CREATE CLUSTERED INDEX [IDX_01] ON [dbo].[II_InstallSW] 
(
       [ClientId] ASC,
       [ModifyDate] ASC,
       [OnCurrent] ASC
)CREATE NONCLUSTERED INDEX [IDX_2] ON [dbo].[II_InstallSW] 
(
       [ClientId] ASC,
       [PackageId] ASC
)CREATE NONCLUSTERED INDEX [IDX_3] ON [dbo].[II_InstallSW] 
(
       [ModifyDate] ASC,
       [PackageId] ASC
)系统的title可以点击 点击后按照该字段排序显示 ,也就是说按照什么排序 不一定
点击其他几个字段还都好 和已有的索引沾边 大概都用上索引了 速度可以
就是点击
InstallDate,InvStatus排序的时候可能是由于没有相关索引 速度很慢 结果出不来像这样动态变化的order by 大家都怎么处理的呀给每个字段都单独建上索引是不可能的  因为程序里所有的页面都可以这样选择排序方式 难道要吧每个表每个字段都建立索引呀

解决方案 »

  1.   

    declare @s datetime ,@s2 datetime
    set @s='2009-05-11 00:00:00'
    set @s2='2009-08-11 23:59:59' 
    SELECT top(10) A.ClientId,A.InvStatus, A.OnCurrent, A.ModifyDate ,A.InstallDate as InstallDate2 
    FROM II_InstallSW A 
    WHERE  A.ModifyDate between @s and @s2
    order by InstallDate2 asc 
    改为变量 试试我好想哪里看到过 这个变为变量放到条件加快。也许是减慢 你去试试吧 
    执行计划CTRL+L 看看就知道了 。。
      

  2.   

    改为between  and
    会快点吧 
      

  3.   

    就是点击 
    InstallDate,InvStatus排序的时候可能是由于没有相关索引 速度很慢 结果出不来 那你应该可以判断是点了哪个,再用动态执行,ORDER BY 点击的那个
      

  4.   

    如果不是很多的话,用if也可以啊declare @order varchar(4000)
    set @order=''if 条件1 and @order<>''
        @order = 'select * from ta order by '+@order
    if 条件2 and @order<>''。    exec(@order)
      

  5.   

    BETWEEN .......AND ..已经很快了
      

  6.   

    between  and 也试了 还是不行 
    分区表 还不太熟悉 
      

  7.   

    SELECT top(10) A.ClientId,A.InvStatus, A.OnCurrent, A.ModifyDate ,A.InstallDate as InstallDate2 
    FROM II_InstallSW A 
    WHERE  A.ModifyDate >= '2009-05-11 00:00:00' AND A.ModifyDate <= '2009-08-11 23:59:59' 
    order by InstallDate2 asc 
    建议楼主用动态连接成SQL,排序字段用变量来表示,用参数来传递排序字段
      

  8.   

    是说order by 的内容用变量代替么  这样应该不会让速度加快特别多吧
      

  9.   

    数据量 600~1000万左右。 sqlserver索引搞不定的,只能分表了
      

  10.   

    http://topic.csdn.net/u/20090810/14/24fb72f2-af40-4fd9-9ebd-9957ff2041f7.html
    看这个帖子 上面有高人回答 分区表的东西
      

  11.   

    我先去拜读一下
    另外如果是索引的话应该建立什么的
    CREATE NONCLUSTERED INDEX [IDX_3] ON [dbo].[II_InstallSW] 
    (     [ModifyDate] ASC,
          [InstallDateas]  asc 
    )这样?建立一个测试 没什么改善呢?
      

  12.   

    关键是排序,如果选择到的数据不多,可以考虑查询时不排序,在客户端处理排序,好多控件都有sort方法
      

  13.   

    恩 feixianxxx 兄的帖子真是不错 学习了 —— 你咋不结贴呢 这顿看啊 呵呵
      

  14.   

    数据比较多的 我说的数据量600~1000万是指查询出来的数据(因为ModifyDate得时间比较集中)
      

  15.   

    按ModifyDate建聚集索引试一下,这样可以避免全表扫描
      

  16.   

    CREATE NONCLUSTERED INDEX [IDX_3] ON [dbo].[II_InstallSW] 
    (    [InstallDateas] ASC, 
          [ModifyDate]  asc 
    ) 把两个字段换位置就好了
    索引生效恩 由于不能建立聚集 所以只能非聚集了
      

  17.   

    分区索引 对于分区键 还有些不明确
    不知道用什么好 时间好象不行 因为我的时间比较集中 还会把数据存在一个分区中
    user不知道怎么样 用user的话我经常会在所有用户中搜索的 就是说要在所有分区中查找 不知道效率如何
      

  18.   

    1000W的数据,对于SQL的普通表来讲,已经负担很重了。
    如果还要频繁的读取数据,那么效果就更差了。
    所以,建议楼主用分区表。
    索引在这个时候不会起到明显的作用。如果针对时间字段的排序,数据量比较大,那么最好为分区表。