SQL left join 效率问题

castlooo 2008-12-22 03:49:34

--SQL1
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID
WHERE B.ID>100 AND A.ID>100

--SQL2
SELECT * FROM A
LEFT JOIN
( SELECT * FROM B WHERE B.ID>100) TB
ON A.ID = TB.ID
WHERE A.ID>100


SQL1 和SQL2那个效率高些? 为什么?
...全文
1254 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
gblovezx 2012-05-31
  • 打赏
  • 举报
回复
有没有人真正的试过呢
mikkk 2012-02-06
  • 打赏
  • 举报
回复
来学习大家的心得。
MikeCheers 2011-02-23
  • 打赏
  • 举报
回复
应该这样写比较高效
SELECT * FROM
( SELECT * FROM A WHERE A.ID > 100) TA
LEFT JOIN
( SELECT * FROM B WHERE B.ID > 100) TB
ON TA.ID = TB.ID

最起码left join应该尽量减少左表大小, 才是提升效率的根本.

bhtfg538 2008-12-22
  • 打赏
  • 举报
回复
看看他们的 执行 顺训
就知道他们的 效率 --SQL1
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID
WHERE B.ID>100 AND A.ID>100
我没开SMSS
物理顺序大概是 先从FROM 表找到 A 发现 有 where 过滤 a 的记录
然后找到 b 同样过滤 B.ID>100
然后 执行 LEFT JOIN 把a 表的 记录重新加进去
再执行ON 连接
--SQL2
SELECT * FROM A
LEFT JOIN
( SELECT * FROM B WHERE B.ID>100) TB
ON A.ID = TB.ID
WHERE A.ID>100

这个的话 基本是这样的
( SELECT * FROM B WHERE B.ID>100) TB
这个 基本 和 SQL1差不多
MS SQL SERVER 2005 应该是的
bhtfg538 2008-12-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 castlooo 的帖子:]
SQL code
--SQL1
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID
WHERE B.ID>100 AND A.ID>100

--SQL2
SELECT * FROM A
LEFT JOIN
( SELECT * FROM B WHERE B.ID>100) TB
ON A.ID = TB.ID
WHERE A.ID>100



SQL1 和SQL2那个效率高些? 为什么?
[/Quote]
LZ 可以去看看 我的 www.cnblogs.com/bhtfg538
bluefangxiao 2008-12-22
  • 打赏
  • 举报
回复
up
wanshichen 2008-12-22
  • 打赏
  • 举报
回复
从写法上推荐第一种,比较正统的高效写法……
等不到来世 2008-12-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 dobear_0922 的回复:]
引用 12 楼 dobear_0922 的回复:
SQL code--SQL1
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID
WHERE B.ID>100 AND A.ID>100
--相当于:
SELECT * FROM A JOIN B ON A.ID = B.ID
WHERE B.ID>100 AND A.ID>100


因为你的筛选条件中包含B表中的列,优化器会将外left outer join 改为inner join


SQL1与SQL2产生的结果有可能会不同(SQL1的结果集中没有B表字段为NULL的行),当然只比较执行时间的话,SQL1会…
[/Quote]
我买新电脑了,以后估计把上csdn的时间用来打魔兽了!hoho
等不到来世 2008-12-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Rewiah 的回复:]
如果A有个id>100的记录,比如id=101,而b中没有
SQL1不会出现这条记录
SQL2会出现这条记录,其中b.id=null


结果不同的语句比较效率是没有意义的
[/Quote]
果然经验丰富!
Rewiah 2008-12-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xieyueqing 的回复:]
引用 5 楼 Rewiah 的回复:
先不说效率,结果是不同的

结果应该是相同的阿。。。
[/Quote]

这个不用争论,测试下就知道了

create table #a (
id int)

go
create table #b (
id int)

go

insert #a select 101 union all select 102

insert #b select 102 union all select 103

--SQL1
SELECT * FROM #a A LEFT JOIN #b B ON A.ID = B.ID
WHERE B.ID>100 AND A.ID>100

--SQL2
SELECT * FROM #a A
LEFT JOIN
( SELECT * FROM #b B WHERE B.ID>100) TB
ON A.ID = TB.ID
WHERE A.ID>100

--SQL3
SELECT * FROM #a A LEFT JOIN #b B ON A.ID = B.ID
WHERE A.ID>100

--结果
id id
----------- -----------
102 102

(1 行受影响)

id id
----------- -----------
101 NULL
102 102

(2 行受影响)

id id
----------- -----------
101 NULL
102 102

(2 行受影响)
dobear_0922 2008-12-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 dobear_0922 的回复:]
SQL code--SQL1
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID
WHERE B.ID>100 AND A.ID>100
--相当于:
SELECT * FROM A JOIN B ON A.ID = B.ID
WHERE B.ID>100 AND A.ID>100



因为你的筛选条件中包含B表中的列,优化器会将外left outer join 改为inner join
[/Quote]

SQL1与SQL2产生的结果有可能会不同(SQL1的结果集中没有B表字段为NULL的行),当然只比较执行时间的话,SQL1会快一些。
jackyren007 2008-12-22
  • 打赏
  • 举报
回复
还是放到查询规划器,看下,是怎么规划的就知道了.
dobear_0922 2008-12-22
  • 打赏
  • 举报
回复
--SQL1 
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID
WHERE B.ID>100 AND A.ID>100
--相当于:
SELECT * FROM A JOIN B ON A.ID = B.ID
WHERE B.ID>100 AND A.ID>100


因为你的筛选条件中包含B表中的列,优化器会将外left outer join 改为inner join
jackyren007 2008-12-22
  • 打赏
  • 举报
回复
感觉B快点.

B有个:SELECT * FROM B WHERE B.ID>100

就已经过滤掉一些数据了.

最后再做的LEFT JOIN
Rewiah 2008-12-22
  • 打赏
  • 举报
回复
正常写法应该

--SQL1
SELECT * FROM A LEFT JOIN B ON A.ID = B.ID
WHERE A.ID>100


这样效果就一样了
效率应该是这个最好
xieyueqing 2008-12-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Rewiah 的回复:]
先不说效率,结果是不同的
[/Quote]
结果应该是相同的阿。。。
Rewiah 2008-12-22
  • 打赏
  • 举报
回复
如果A有个id>100的记录,比如id=101,而b中没有
SQL1不会出现这条记录
SQL2会出现这条记录,其中b.id=null


结果不同的语句比较效率是没有意义的
等不到来世 2008-12-22
  • 打赏
  • 举报
回复
我原来做过一定的测试,貌似两个效率相近。
应该跟数据量和数据分布情况等具体环境有关系。
单从写法上来说,推荐第1种。
xieyueqing 2008-12-22
  • 打赏
  • 举报
回复
自己测试一下吧,有些东西没准的,SQL 的优化器还是不错的
Rewiah 2008-12-22
  • 打赏
  • 举报
回复
先不说效率,结果是不同的
加载更多回复(4)
通过慢sql分析的学习,了解什么是慢sql,以及慢SQL会引起那些性能问题。清楚慢sql日志的设置,然后再通过慢sql分析工具的学习,清楚慢sql分析的步骤和流程。慢sql分析工具:mysqldumpslow工具、explain工具、profile工具、Optimizer Trace工具。 提供课程中所使用的sql语句。 课程内容:第一章:课程简介1、课程介绍2、课程大纲 第二章:慢sql简介1、慢sql简介2、慢sql会引起的问题 第三章:慢日志的设置1、慢sql的分析流程2、慢日志参数理解3、慢日志参数设置:第1种方式:my.ini文件设置4、慢日志参数设置:第2种方式:sql脚本设置5、慢日志参数设置-效果验证 第四章:如何发现慢sql1、如何发现慢sql:第1种方式:慢日志文件2、如何发现慢sql:第2种方式:mysql库的slow_log表 第五章:慢sql分析工具1、慢sql提取-mysqldumpslow工具-使用方法2、慢sql提取-mysqldumpslow工具-操作实战3、慢sql的执行计划分析-explain分析-执行计划结果说明4、慢sql的执行计划分析-explain分析-索引介绍+type类型举例5、慢sql的资源开销分析-profile分析-分析步骤6、慢sql的资源开销分析-profile分析-show profile执行阶段说明7、慢sql的资源开销分析-profile分析-完整列表说明+操作实战8、慢sql的跟踪分析-Optimizer Trace分析-分析步骤9、慢sql的跟踪分析-Optimizer Trace表的介绍10、索引失效场景举例 第六章:慢日志清理1、慢日志清理

34,575

社区成员

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

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