+ -
当前位置:首页 → 问答吧 → 语句增加order by后由查询零秒变为了15秒,求解

语句增加order by后由查询零秒变为了15秒,求解

时间:2011-12-13

来源:互联网

查询语句如下:
  这是带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,差不多。 求指点。。。很急!!!!!

作者: linagxiaojing   发布时间: 2011-12-13

ORDER BY 排序需要时间

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

作者: fredrickhu   发布时间: 2011-12-13

这都不知道,真蠢!哎,没救啦。。。

作者: ou444   发布时间: 2011-12-13

引用 1 楼 fredrickhu 的回复:
ORDER BY 排序需要时间

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


  我这两张表被排序的都是主键 都是唯一的呢。

作者: linagxiaojing   发布时间: 2011-12-13

呵呵,开玩笑。。。

作者: ou444   发布时间: 2011-12-13

你为啥不直接查询 用cte表达式,又用派生表?
SQL code
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 

作者: ssp2009   发布时间: 2011-12-13

引用 5 楼 ssp2009 的回复:
你为啥不直接查询 用cte表达式,又用派生表?

SQL code
select top 1000 SZ_QStandType.QStandTypeID,SZ_QStandType.QStandTypeName
from SZ_QStand inner join containstable(SZ_QStand,(QStandFRContent,QStandGRContent),'(" 测……


最开始我的语句也没用到cte
SQL code

declare @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操作,不是我想要的结果 谢谢你的回答呢

作者: linagxiaojing   发布时间: 2011-12-13

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

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

作者: qianjin036a   发布时间: 2011-12-13

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

作者: linagxiaojing   发布时间: 2011-12-13

引用 7 楼 qianjin036a 的回复:
1.你比较你这两句的最后部分:
select * from
(select distinct top 1000 * from cte order by QStandTypeID asc)t;

select * from (select top 1000 * from cte )t;
一个要排序,另一个只要取前1000个,当然时间有大差别了(因为你的公用表达式比较复杂,而且还用了全文索……


  有点不大懂您的意思。 你可以把句子写全吗? 就算你说的是对的。 那为什么我另外一张表跟这张表一样,用一样的查询方法,速度1秒都不用呢。 谢谢你的回答

作者: linagxiaojing   发布时间: 2011-12-13

如果你用了全文索引,那搜索的速度并非完全与你的记录数成正比的,而是与你搜索的内容相关.

作者: qianjin036a   发布时间: 2011-12-13

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

select * from (select top 1000 * from cte )t;

这个查询语句不是你写的吗?

作者: qianjin036a   发布时间: 2011-12-13

引用 10 楼 qianjin036a 的回复:
如果你用了全文索引,那搜索的速度并非完全与你的记录数成正比的,而是与你搜索的内容相关.


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

作者: linagxiaojing   发布时间: 2011-12-13

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

select * from (select top 1000 * from cte )t;

这个查询语句不是你写的吗?


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

作者: linagxiaojing   发布时间: 2011-12-13