日期:2014-05-18  浏览次数:20498 次

语句增加order by后由查询零秒变为了15秒,求解
查询语句如下:
  这是带order by语句的
 
SQL code

    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语句
 
SQL code

    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.你比较你这两句的最后部分:
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 asc

select top 1000 * from cte

而要强行加一个子查询呢?