语句增加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
另外一个时间少估计是因为有主键 而被排序列是主键
作者: fredrickhu 发布时间: 2011-12-13
作者: ou444 发布时间: 2011-12-13
ORDER BY 排序需要时间
另外一个时间少估计是因为有主键 而被排序列是主键
我这两张表被排序的都是主键 都是唯一的呢。
作者: linagxiaojing 发布时间: 2011-12-13
作者: ou444 发布时间: 2011-12-13
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
你为啥不直接查询 用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
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
作者: 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个,当然时间有大差别了(因为你的公用表达式比较复杂,而且还用了全文索……
有点不大懂您的意思。 你可以把句子写全吗? 就算你说的是对的。 那为什么我另外一张表跟这张表一样,用一样的查询方法,速度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
如果你用了全文索引,那搜索的速度并非完全与你的记录数成正比的,而是与你搜索的内容相关.
我单独测试了我的全文索引所需时间,一秒不到,就是加上order by之后就变很慢, 我去掉order by 留distinct,也一样很慢,我估计distinct的执行方法和order by 方法差不多。
作者: linagxiaojing 发布时间: 2011-12-13
这两句,不就是你的查询语句最后的那部分么,它是从一个公用表达式中查询内容.
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
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28