查询语句如下:
   这是带order by语句的
    
    declare @d datetime
  set @d=getdate();
with cte as(select SZ_QStandType.QStandTypeID,SZ_QStandType.QStandTypeName from SZ_QStand inner join containstable(SZ_QStand,(QStandFRContent,QStandGRContent),'(" 测量")',500)as k on QStandID=k.[key] inner join SZ_QStandType on SZ_QStand.QStandTypeID=SZ_QStandType.QStandTypeID)select  * from (select distinct  top 1000 * from cte  order by QStandTypeID asc)t;
select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())
    
 
  结果如图所示:
  
 
  结果有36条。  下面是不带order by和distinct语句
   
    declare @d datetime
  set @d=getdate();
with cte as(select SZ_QStandType.QStandTypeID,SZ_QStandType.QStandTypeName from SZ_QStand inner join containstable(SZ_QStand,(QStandFRContent,QStandGRContent),'(" 测量")',1000)as k on QStandID=k.[key] inner join SZ_QStandType on SZ_QStand.QStandTypeID=SZ_QStandType.QStandTypeID)select  * from (select   top 1000 * from cte  )t;
select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())
  结果如下图所示:
  
  结果有533行  总结了问题的根源是时间都耗费在了order by语句上面,问题关键是我有另外一张表跟这张的结果一模一样,数据19000条
这个表的数据是9000条,那个表加了order by语句查询也1秒钟不到,这个表数据更少但不知道为何耗时15秒   我检测了这两张表的logical readers,差不多。  求指点很急!!!!!

解决方案 »

  1.   

    ORDER BY 排序需要时间另外一个时间少估计是因为有主键 而被排序列是主键
      

  2.   

    你为啥不直接查询 用cte表达式,又用派生表?
    select top 1000 SZ_QStandType.QStandTypeID,SZ_QStandType.QStandTypeName 
    from SZ_QStand inner join containstable(SZ_QStand,(QStandFRContent,QStandGRContent),'(" 测量")',1000)as k on QStandID=k.[key] 
    inner join SZ_QStandType on SZ_QStand.QStandTypeID=SZ_QStandType.QStandTypeID
    order by 
      

  3.   


    最开始我的语句也没用到ctedeclare @d datetime
      set @d=getdate();
    select distinct SZ_QStandType.QStandTypeID,SZ_QStandType.QStandTypeName from SZ_QStand inner join containstable(SZ_QStand,(QStandFRContent,QStandGRContent),'(" 测量")',5000)as k on QStandID=k.[key] inner join SZ_QStandType on SZ_QStand.QStandTypeID=SZ_QStandType.QStandTypeID order by SZ_QStandType.QStandTypeID
    select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())  但是貌似用cte效率更高。  你的这个语句查询出来没有进行distinct操作,不是我想要的结果 谢谢你的回答呢
      

  4.   

    1.你比较你这两句的最后部分:
    select  * from 
    (select distinct  top 1000 * from cte  order by QStandTypeID asc)t;select  * from (select   top 1000 * from cte  )t;
    一个要排序,另一个只要取前1000个,当然时间有大差别了(因为你的公用表达式比较复杂,而且还用了全文索引)
    2.就你这两句来看,看上去有点奇怪,为什么不这样写呢:select distinct  top 1000 * from cte  order by QStandTypeID ascselect top 1000 * from cte而要强行加一个子查询呢?
      

  5.   

    加了distinct是我想要的结果,但是查询速度还是没变
      

  6.   

    这两句,不就是你的查询语句最后的那部分么,它是从一个公用表达式中查询内容.
    select * from  
    (select distinct top 1000 * from cte order by QStandTypeID asc)t;select * from (select top 1000 * from cte )t;这个查询语句不是你写的吗?
      

  7.   


      我单独测试了我的全文索引所需时间,一秒不到,就是加上order by之后就变很慢, 我去掉order by 留distinct,也一样很慢,我估计distinct的执行方法和order by 方法差不多。
      

  8.   


      噗,我知道是我写的呢。 但这样没有任何意义呢,这里的top1000只是象征性的加上去的,查询的结果还是得看全文缩影里面那个500,我限定查询结果只有500 这里只是测试呢。