1

这个问题的目的是找出如何使用内部连接来过滤掉结果。
我有 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先过滤掉子句再对结果集进行inner join,还是按顺序过滤(先inner join,后where子句)?

4

1 回答 1

2

理论上,在关系代数之后,首先应用连接,然后整个集合被 WHERE 子句过滤,所以看起来第一个示例的查询效果更好。但是 sql server 会优化查询,并根据需要更改这些操作的顺序;所以这些可以在加入之前应用的过滤器将被应用,然后去加入,然后其他以前不能应用的过滤器。此外,这两个查询的执行计划应该完全相同。自己检查一下。

于 2013-03-19T16:40:19.240 回答