哪种写法查询效率高一点?

ggsysy 2014-04-14 08:38:50
select a.*,c.* 
from a
left join b on a.id=b.id
left join c on a.id=c.id


select a.*,c.*
from a
left join b on a.id=b.id
left join c on b.id=c.id


不同点就在于left join c的条件,如果连接的表有很多的话,是不是两者的查询速度就会产生很大的区别。
...全文
181 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ggsysy 2014-04-14
  • 打赏
  • 举报
回复
引用 7 楼 sz_haitao 的回复:
初步验证了一下,结果都一样 也许数据不够典型,未能发现所有的可能 (引发一个新问题:sql2005有没有一个函数 checksumRecord(字段顺序是否敏感) ? 这样就可以方便地比较2个sql的结果是否完全一样)


declare @a table (fid int,fnamea varchar(20))
declare @b table (fid int,fnameb varchar(20))
declare @c table (fid int,fnamec varchar(20))

insert @a
select 1,'a1'
union all select 2,'a2'
union all select 3,'a3'
union all select 2,'a2'

insert @b
select 1,'b1'
union all select 2,'b2'
union all select 4,'b4'
union all select 2,'b2'
union all select 4,'b4'

insert @c
select 1,'c1'
union all select 2,'c2'
union all select 4,'c4'
union all select 5,'c5'
union all select 2,'c2'
union all select 4,'c4'
union all select 5,'c5'

select *
from @a a
left join @b b on a.fid=b.fid
left join @c c on a.fid=c.fid

select *
from @a a
left join @b b on a.fid=b.fid
left join @c c on b.fid=c.fid
把@b中的select 1,'b1' union all去掉,两者的结果确实是不同的。
haitao 2014-04-14
  • 打赏
  • 举报
回复
初步验证了一下,结果都一样 也许数据不够典型,未能发现所有的可能 (引发一个新问题:sql2005有没有一个函数 checksumRecord(字段顺序是否敏感) ? 这样就可以方便地比较2个sql的结果是否完全一样)


declare @a table (fid int,fnamea varchar(20))
declare @b table (fid int,fnameb varchar(20))
declare @c table (fid int,fnamec varchar(20))

insert @a
select 1,'a1'
union all select 2,'a2'
union all select 3,'a3'
union all select 2,'a2'

insert @b
select 1,'b1'
union all select 2,'b2'
union all select 4,'b4'
union all select 2,'b2'
union all select 4,'b4'

insert @c
select 1,'c1'
union all select 2,'c2'
union all select 4,'c4'
union all select 5,'c5'
union all select 2,'c2'
union all select 4,'c4'
union all select 5,'c5'

select *
from @a a
left join @b b on a.fid=b.fid
left join @c c on a.fid=c.fid

select *
from @a a
left join @b b on a.fid=b.fid
left join @c c on b.fid=c.fid
ggsysy 2014-04-14
  • 打赏
  • 举报
回复
引用 4 楼 zbdzjx 的回复:
结果会不一样,如果一笔记录,A、C两个表有,B表没有,第一个语句会显示出C的内容来,而第二个语句就不会显示C的内容了。
那如果left改为inner的话,哪种速度快?
---涛声依旧--- 2014-04-14
  • 打赏
  • 举报
回复
楼主估计还没有明白left join的意义,语义上是不一样的,结果可能也不一样
zbdzjx 2014-04-14
  • 打赏
  • 举报
回复
结果会不一样,如果一笔记录,A、C两个表有,B表没有,第一个语句会显示出C的内容来,而第二个语句就不会显示C的内容了。
ggsysy 2014-04-14
  • 打赏
  • 举报
回复
结果应该是一样的吧。不知道第二种写法会不会快一点,条件像链子一样接过来的。
發糞塗牆 2014-04-14
  • 打赏
  • 举报
回复
首先语义上就不一样,可能结果也不一样,这个通常来说是没有可比性的。要视乎你业务希望得到什么数据。 如果你非要对比性能,把两个代码放到一个查询页面,然后开启实际执行计划,再同时执行,然后看百分比
haitao 2014-04-14
  • 打赏
  • 举报
回复
会优化为一样吧? 即符合前面join的b的记录,才与c关联

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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