导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

为什么这两条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
...全文
261 点赞 收藏 32
写回复
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楼的情况请大家指点一下
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告