Date 加索引,很简单的优化

解决方案 »

  1.   


    恩,我知道了,您是说那几个nvarchar和int吧,那只是说明一下我这个表里还另外有三个字符串的字段和一个整型的字段,并不是字段的名字
      

  2.   

    把你的语句放到sqlserver的查询界面,然后ctrl+l,把下方的图形传出来
      

  3.   

    table,date这些都是保留字,如果你非要用,要么加[],要么加""来包住,特别是table
      

  4.   

    7万数据除非笛卡儿积,不然一般不至于超时,我怀疑你的where条件逻辑有错。
    你试试这种写法:SELECT     Id, date,nvarchar,nvarchar,nvarchar,int
    FROM         table a inner join ((SELECT     TOP (30) Id
                                FROM          table AS table_1
                                ORDER BY Date DESC)) b on a.id=b.id
    union all 
    SELECT     Id, date,nvarchar,nvarchar,nvarchar,int
    FROM         table
    where Date > DATEADD(day, - 30, GETDATE())
    ORDER BY Date DESC
      

  5.   


    嗯,应该是没有逻辑错误,我给date加了索引后不超时了,只是还是有点慢,大约两三秒
    然后虽然您这个语句我没试,但是应该是很快的,因为我分别试过union all两边的语句,都很快
    不过这样出来的结果至少是不能直接使用的,因为两边查出来的结果一般情况下是有交集的
      

  6.   


    恩,我知道了,谢谢您,但是转换出来应该是union而不是union all,转换成union all就多了
      

  7.   

    你在外层distinct一下,union会引入排序和去重操作不利于性能。你的数据集上一个只有30条,下一个未知,估计不多,几十条数据distinct比在内存union性能高好多
      

  8.   


    嗯,明白了,谢谢
    另外再请教一下,事关union那令人蛋痛的order by处理方式,您说是用
    SELECT a.Id, a.date,a.nvarchar,a.nvarchar,a.nvarchar,a.int FROM  table a inner join ((SELECT  TOP (30) Id FROM table AS table_1 ORDER BY Date DESC)) b on a.id=b.id
    好呢还是用
    SELECT Id, date,nvarchar,nvarchar,nvarchar,int FROM ((SELECT  TOP (30) Id, date,nvarchar,nvarchar,nvarchar,int FROM table AS table_1 ORDER BY Date DESC)) b
    好?
      

  9.   


    要的,union子句中不能直接使用order by,只能在最后面写一个order by对整个union的结果集进行排序,要想在union子句中写order by只能整成子句的子句
    那么您觉得是第二条好?
      

  10.   

    坚持一个原则:尽快降低结果集的量,对小量数据进行order by、distinct这些操作并不会严重影响性能。
    所以你看看哪个操作可能最快在第一、二不就能降低要处理的结果集吧
      

  11.   

    那么,就结贴了,最终结果就是:用or拼条件的话,date没有索引会超时,date有索引可查询但是略慢;而改用union的话即使没有索引也很快