left join 查询效率疑问:主表先过滤后关联 是否会比 先关联后过滤 效率高?

bakerbaker 2016-01-22 02:03:00
第一种写法:
SELECT * FROM (SELECT * FROM Table1 WHERE Name LIKE 'One%') a LEFT JOIN Table2 b ON a.ID=b.ID

第二种写法
SELECT * FROM Table1 a LEFT JOIN Table2 b ON a.ID=b.ID WHERE a.Name LIKE 'One%'

请问大侠们这两种写法,哪一个效率会高一点呢
...全文
6286 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
maogy9527 2019-06-05
  • 打赏
  • 举报
回复
引用 6 楼 zbdzjx 的回复:
[quote=引用 5 楼 bakerbaker 的回复:] [quote=引用 1 楼 zbdzjx 的回复:] 个人经验: 之前在看书上说的,应该是第一种效率高,但实际使用过程中发现,第二种效率高。
为什么会是这样的呢?如果Table1的数据比较多的话,第一种写法首先进行了一次过滤,数据量会小了,然后再作左关联,速度不是应该更快些么?第二种写法是先关联(关联的次数肯定会多于第一种的)再过滤,为什么这样反而会更快呢?[/quote] 之前看书上就是这么说的,说是先过滤再连接,会比较快。但实际上我测试过一些语句,都是先关联再过滤比较快。猜测可能和索引有关,过滤完后可能索引就无法用了,所以导致速度慢。 在实际开发过程中,除非是发现特别慢的,否则我都是习惯于先关联再过滤;如果是特别慢的,两种情况都试,对比看一下。[/quote]我也听说,如果先过滤在关联会导致无法使用索引,效率会更低。但是我自己写两个关联的sql,一个是先过滤在关联,另一个是关联后在过滤,最后发现他们使用的索引都一样。但是先关联后在过滤的方式执行时间要短一些。
bakerbaker 2016-01-25
  • 打赏
  • 举报
回复
引用 1 楼 zbdzjx 的回复:
个人经验: 之前在看书上说的,应该是第一种效率高,但实际使用过程中发现,第二种效率高。
为什么会是这样的呢?如果Table1的数据比较多的话,第一种写法首先进行了一次过滤,数据量会小了,然后再作左关联,速度不是应该更快些么?第二种写法是先关联(关联的次数肯定会多于第一种的)再过滤,为什么这样反而会更快呢?
吉普赛的歌 版主 2016-01-25
  • 打赏
  • 举报
回复
--第一种写法
SELECT * FROM (SELECT * FROM Table1 WHERE Name LIKE 'One%') a LEFT JOIN Table2 b ON a.ID=b.ID

--第二种写法(跟第一种效率是一样的)
SELECT * FROM Table1 a LEFT JOIN Table2 b ON a.ID=b.ID WHERE a.Name LIKE 'One%'

--第三种写法(如果 Table1,Table2 都是大表,而且第1个select条件过滤后记录很少,效果显著 )
SELECT * INTO #tmp FROM Table1 WHERE Name LIKE 'One%'
SELECT * FROM #tmp a LEFT JOIN Table2 b ON a.ID=b.ID
zbdzjx 2016-01-25
  • 打赏
  • 举报
回复
引用 5 楼 bakerbaker 的回复:
[quote=引用 1 楼 zbdzjx 的回复:] 个人经验: 之前在看书上说的,应该是第一种效率高,但实际使用过程中发现,第二种效率高。
为什么会是这样的呢?如果Table1的数据比较多的话,第一种写法首先进行了一次过滤,数据量会小了,然后再作左关联,速度不是应该更快些么?第二种写法是先关联(关联的次数肯定会多于第一种的)再过滤,为什么这样反而会更快呢?[/quote] 之前看书上就是这么说的,说是先过滤再连接,会比较快。但实际上我测试过一些语句,都是先关联再过滤比较快。猜测可能和索引有关,过滤完后可能索引就无法用了,所以导致速度慢。 在实际开发过程中,除非是发现特别慢的,否则我都是习惯于先关联再过滤;如果是特别慢的,两种情况都试,对比看一下。
xdashewan 2016-01-22
  • 打赏
  • 举报
回复
你打开执行计划看一下,应该是相同的
中国风 2016-01-22
  • 打赏
  • 举报
回复
你提供语句应该是相同的性能 在特定环境下如多表某些情况会改变执行顺序,性能有影响 注意:这类只是标准而不是例外
道素 2016-01-22
  • 打赏
  • 举报
回复
效率应该是一样的 你可以用执行计划看下
zbdzjx 2016-01-22
  • 打赏
  • 举报
回复 1
个人经验: 之前在看书上说的,应该是第一种效率高,但实际使用过程中发现,第二种效率高。

34,838

社区成员

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

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