求解,这俩SQL有什么区别

kiba518 2013-09-29 10:02:51
RT,这俩SQL在性能上有什么区别,为什么
select b.* from a left join b on a.id=b.id where [a].id=1
select b.* from a left join b on a.id=b.id where [b].id=1
...全文
602 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我觉得这两句已经区别是有点,但是实际运行速度是一样的
jwwyqs 2013-10-08
  • 打赏
  • 举报
回复
第一个是leftjoin 第二个相当于inner join
小魚人 2013-10-08
  • 打赏
  • 举报
回复
引用 20 楼 ai_li7758521 的回复:
[quote=引用 15 楼 kiba518 的回复:] 大概明白了 是不是 sql 执行时 先执行from 连接了后 在执行 where 因为我查询的是 b.* 在执行where 的时候 如果我用 [b].id=1 sql就直接执行了 但是 我用 [a].id=1 的时候 他就找不到a 就得使用a.id=b.id 让b和a在连接一次 是这样吧
SQL 语句执行顺序
(8)SELECT (9)DISTINCT (11)<TOP_specification> <select_list>
(1)FROM <left_table>
(3) <join_type> JOIN <right_table>
(2)    ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH {CUBE | ROLLUP}
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>
[/quote] 正解
雾岛心情 2013-10-07
  • 打赏
  • 举报
回复
估计没有做索引吧,另外一个估计采用了表扫描 扫描了整个数据表
reenjie 2013-10-07
  • 打赏
  • 举报
回复
你應該搞懂left join 是什么意思。LEFT JOIN 关键字会从左表那里返回所有的行,即使在右表中没有匹配的行。
guostong 2013-10-03
  • 打赏
  • 举报
回复
select b.* from a left join b on a.id=b.id where [a].id=1 你需要的是一个 inner join 为什么写成 left join?
Cloud_Hero 2013-10-01
  • 打赏
  • 举报
回复
第一句的过滤条件与返回的列不一致,导致先连接再过滤。 第二句,先对b过滤,再连接。
fengxiaohan211 2013-09-30
  • 打赏
  • 举报
回复
引用 20 楼 ai_li7758521 的回复:
[quote=引用 15 楼 kiba518 的回复:] 大概明白了 是不是 sql 执行时 先执行from 连接了后 在执行 where 因为我查询的是 b.* 在执行where 的时候 如果我用 [b].id=1 sql就直接执行了 但是 我用 [a].id=1 的时候 他就找不到a 就得使用a.id=b.id 让b和a在连接一次 是这样吧
SQL 语句执行顺序
(8)SELECT (9)DISTINCT (11)<TOP_specification> <select_list>
(1)FROM <left_table>
(3) <join_type> JOIN <right_table>
(2)    ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH {CUBE | ROLLUP}
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>
[/quote] 赞
北极海hein 2013-09-30
  • 打赏
  • 举报
回复
select b.* from a left join b on a.id=b.id where [a].id=1 这个使用了左联接,执行计划优先查询A表,如果a.id有索引那性能更好。 select b.* from a left join b on a.id=b.id where [b].id=1 这个同样使用左联接,但因为where条件出现了b.id=1的条件,导致左联接失效。 等价于:select b.* from a join b on a.id=b.id where [b].id=1 http://item.taobao.com/item.htm?spm=686.1000925.1000774.23.nFGG8X&id=27406928729
Andy__Huang 2013-09-29
  • 打赏
  • 举报
回复
select b.* from a left join b on a.id=b.id where [a].id=1 --以a.id为条件查询 select b.* from a left join b on a.id=b.id where [b].id=1 --只查询b表数据,但又关联到a表,这个语句没有意义 第2句相当于: select * from b where id=1 -->查询本表,条件也是本表
發糞塗牆 2013-09-29
  • 打赏
  • 举报
回复
逻辑上的顺序是你那种,但是实际上就很难说了,优化器来决定,但是逻辑上先优化是必须的,也是你能做的。语义不同,其实没什么可比性
kiba518 2013-09-29
  • 打赏
  • 举报
回复
大概明白了 是不是 sql 执行时 先执行from 连接了后 在执行 where 因为我查询的是 b.* 在执行where 的时候 如果我用 [b].id=1 sql就直接执行了 但是 我用 [a].id=1 的时候 他就找不到a 就得使用a.id=b.id 让b和a在连接一次 是这样吧
quchen520 2013-09-29
  • 打赏
  • 举报
回复
因为笛卡儿积的筛选条件不同
第一条不能优化,优化了语义和结果都不同了
kiba518 2013-09-29
  • 打赏
  • 举报
回复
两个SQL 返回数据一样 ID是聚集索引 还有第一条两边ID也一样 为什么没优化掉 是不是 select b.* 但是 where 用的是a 就又这个问题啊
發糞塗牆 2013-09-29
  • 打赏
  • 举报
回复
不同的语义没什么可比性
quchen520 2013-09-29
  • 打赏
  • 举报
回复
执行计划 存在巨大差异
select b.* from a left join b on a.id=b.id where [a].id=1 这句逻辑读取破万

select b.* from a left join b on a.id=b.id where [b].id=1 这句逻辑读取在10以内


差异打是正常的。。。
你的第二条,执行计划给你把a.id=b.id这个条件给优化掉了,因为你的两边id都一样。
而第一条,因为where中是a.id,所以要查b.id,a.id=b.id这个条件不能省。。

顺便请教,哪位大神能教我一下,引用功能怎么用。。。点了没效果阿。。。
唐诗三百首 2013-09-29
  • 打赏
  • 举报
回复
引用 7 楼 kiba518 的回复:
执行计划 存在巨大差异 select b.* from a left join b on a.id=b.id where [a].id=1 这句逻辑读取破万 select b.* from a left join b on a.id=b.id where [b].id=1 这句逻辑读取在10以内
--> 返回的数据量不一样吧.
唐诗三百首 2013-09-29
  • 打赏
  • 举报
回复
引用 6 楼 kiba518 的回复:
A B表数据量一样 ID 也一样 就是其他字段内容不一样 相当于一个大表 拆成了两个表
建议: 1.A/B表id字段上最好都有索引. 2.既然A/B表的ID一样,SQL可简化为

select b.* from b where b.id=1
kiba518 2013-09-29
  • 打赏
  • 举报
回复
就是特别奇怪 为什么存在这么大的差异
kiba518 2013-09-29
  • 打赏
  • 举报
回复
执行计划 存在巨大差异 select b.* from a left join b on a.id=b.id where [a].id=1 这句逻辑读取破万 select b.* from a left join b on a.id=b.id where [b].id=1 这句逻辑读取在10以内
加载更多回复(10)

34,587

社区成员

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

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