为什么这两条sql 语句的执行效率差别这么大?

xyunsh 2007-11-30 02:40:08
Company表中大约500万条数据,CompanyBought中大约5000条数据。
实现的都是分页
语句一执行时间小于1秒,语句二大约需要一分钟
语句一就是把语句二分成两条sql执行而已
为什么差别这么大呢?
请指点。
thanks

语句一
declare @max int
set @max = (select max(CompanyId) from (select top 20 b.CompanyId from CompanyBought a JOIN Company b ON a.CompanyId = b.CompanyId order by b.CompanyId asc) as tblTmp)

select top 20 b.CompanyId AS Id,b.Name from CompanyBought a JOIN Company b
on a.CompanyId = b.CompanyId where b.CompanyId>@max
order by b.CompanyId asc

语句二
select top 20 b.CompanyId AS Id,b.Name from CompanyBought a JOIN Company b
on a.CompanyId = b.CompanyId where b.CompanyId>
(select max(CompanyId) from (select top 20 b.CompanyId from CompanyBought a JOIN Company b ON a.CompanyId = b.CompanyId order by b.CompanyId asc) as tblTmp)
order by b.CompanyId asc
...全文
319 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
xyunsh 2007-12-17
  • 打赏
  • 举报
回复
再顶一下
cxmcxm 2007-12-07
  • 打赏
  • 举报
回复
将索引去掉,在500Mhz的k6-2老机上试,第一个是20秒,第二个是1分50秒,
执行第二个查询时,硬盘灯不停闪动.
按理说,两查询应该是等价的,不知在大内存的情况下,会不会变好.
cxmcxm 2007-12-05
  • 打赏
  • 举报
回复
自己建了两个表,录入了500万条记录,试了一下,

语句一与语句二基本无差别,都是0秒.


如果连接则时间花费很多,用了18秒.

明天到慢的机器上试一试
威尔亨特 2007-12-05
  • 打赏
  • 举报
回复
第二个就是二层循环链
JL99000 2007-12-05
  • 打赏
  • 举报
回复
每次执行下边sql的时候都要执行这个(select max(CompanyId) from (select top 20 b.CompanyId from CompanyBought a JOIN Company b ON a.CompanyId = b.CompanyId order by b.CompanyId asc) as tblTmp)你看看这个要多少次查询,再结合前面的查询,你想累死谁啊
cxmcxm 2007-12-04
  • 打赏
  • 举报
回复
回18楼

对于一个表,二者的效率差别不大

对于二个表的联接,差别很大

是否将,子查询放到from 处,查询速度还是慢很多.
w2jc 2007-12-04
  • 打赏
  • 举报
回复
回楼上,都是一样 500万条记录
---------------------------
那这就是一个比较有趣的情况了,估计SQL在使用一个表时要聪明一点,能够重用一些查询结果。
具体的情况,你可以仔细看看两组查询的执行计划,就能看出差别。
joymxg 2007-12-03
  • 打赏
  • 举报
回复
学习ING!
szr5494z 2007-12-03
  • 打赏
  • 举报
回复
菜鸟路过,学习了
xyunsh 2007-12-03
  • 打赏
  • 举报
回复
up
xyunsh 2007-12-02
  • 打赏
  • 举报
回复
回18楼

对于一个表,二者的效率差别不大

对于二个表的联接,差别很大
xyunsh 2007-12-02
  • 打赏
  • 举报
回复
回楼上,都是一样 500万条记录
w2jc 2007-12-02
  • 打赏
  • 举报
回复
修正19楼。
看错了,不是用一个表。
你第二次试验里面的表有多少条记录?
如果记录不多,就看不出区别。
w2jc 2007-12-02
  • 打赏
  • 举报
回复
为什么对于一个表的又没什么差别呢?
----------------------------------
呵呵,你的第二次试验里面用的是那个小的表,只有5000条记录,看不出区别的。
换做大表,用子查询那个也是慢的。
cxmcxm 2007-12-01
  • 打赏
  • 举报
回复
其实能否被优化,最关健的是让sql server知道你的子查询是一个独立的查询,如果sql server不能分析出你的子查询是独立的,对每条记录都会去运行你的子查询.

你的语句的情况
将你的子查询放于from 后面,应该可提高速度.
将其改为:
select       top       20       b.CompanyId       AS       Id,b.Name       
from SG_AddOns_Company b ,
(select max(CompanyId) maxcompanyid
from (select top 20 b.CompanyId
from SG_AddOns_Company b order by b.CompanyId asc) as tblTmp) c

where b.CompanyId>c.maxcompanyid
order by b.CompanyId asc
xyunsh 2007-12-01
  • 打赏
  • 举报
回复
up
xyunsh 2007-12-01
  • 打赏
  • 举报
回复
为什么对于一个表的又没什么差别呢?

declare @max int
set @max = (select max(CompanyId) from (select top 20 b.CompanyId from SG_AddOns_Company b order by b.CompanyId asc) as tblTmp)

select top 20 b.CompanyId AS Id,b.Name from SG_AddOns_Company b where b.CompanyId>
@max
order by b.CompanyId asc

select top 20 b.CompanyId AS Id,b.Name from SG_AddOns_Company b where b.CompanyId>
(select max(CompanyId) from (select top 20 b.CompanyId from SG_AddOns_Company b order by b.CompanyId asc) as tblTmp)
order by b.CompanyId asc
cxmcxm 2007-11-30
  • 打赏
  • 举报
回复
按道理这样的东东应该能优化得了,子查询只是独立的且返回一条记录.
将子查询里的表别名改一改试试,改为与外面查询的别名完全不同.可能子查询里的表别名与外面查询的表别名相同, sql server搞不清它是否是独立的子查询.
xyunsh 2007-11-30
  • 打赏
  • 举报
回复
up
xyunsh 2007-11-30
  • 打赏
  • 举报
回复
10楼的情况请大家指点一下
加载更多回复(12)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧