这个问题的目的是找出如何使用内连接来过滤掉结果
我有2个表,由一列相关。表格Names
包含大约100,000条记录。
Table: Names
+----+------+
| ID | Name |
+----+------+
| 1 | A100 |
| 2 | A100 |
| 3 | A100 |
| 4 | A200 |
...
Table: TableB
+----+---------------+
| ID | ChildrenCount |
+----+---------------+
| 1 | 20 |
| 2 | 25 |
| 3 | 10 |
| 4 | 70 |
...
问题1
哪一个查询更有效?
select n.[ID]
from Names n
inner join TableB b
on b.[ID] = n.[ID]
and b.[ChildrenCount] > 50
where n.[Name] Like 'A%'
或
select n.[ID]
from Names n
inner join TableB b
on b.[ID] = n.[ID]
and b.[ChildrenCount] > 50
and n.[Name] Like 'A%'
问题2
[查询1]是先过滤掉where
子句然后对结果集执行内连接,还是按顺序进行过滤(第一个内连接,然后是where子句)?
答案 0 :(得分:2)
理论上,遵循关系代数,首先应用连接,然后通过WHERE子句过滤整个集合,因此看起来第一个示例的查询效果更好。 但是sql server优化了查询,并改变了这些操作的顺序,因为它看起来很合适;所以这些可以在连接之前应用的过滤器将被应用,然后进行连接,以及之后无法应用的其他过滤器。 此外,这两个查询的执行计划应该完全相同。亲自检查一下。