如何在此示例中处理SQL查询?

时间:2013-03-19 16:31:27

标签: sql-server performance tsql

这个问题的目的是找出如何使用内连接来过滤掉结果 我有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子句)?

1 个答案:

答案 0 :(得分:2)

理论上,遵循关系代数,首先应用连接,然后通过WHERE子句过滤整个集合,因此看起来第一个示例的查询效果更好。 但是sql server优化了查询,并改变了这些操作的顺序,因为它看起来很合适;所以这些可以在连接之前应用的过滤器将被应用,然后进行连接,以及之后无法应用的其他过滤器。 此外,这两个查询的执行计划应该完全相同。亲自检查一下。