43

我有以下两个例子。

1. 示例(WHERE)

SELECT 1
  FROM table1 t1
  JOIN table2 t2 ON t1.id = t2.id
 WHERE t2.field = true

2. 示例(JOIN AND)

SELECT 1
  FROM table1 t1
  JOIN table2 t2 ON t1.id = t2.id AND t2.field = true

就性能而言,更快的方法是什么?你喜欢哪个?

4

3 回答 3

22

如果一个过滤器在功能上进入一个JOIN条件(即它是一个实际的连接条件,而不仅仅是一个过滤器),它必须出现在ON那个连接的子句中。

值得注意:

  • 如果将其放在WHERE子句中,则连接为 时的性能相同INNER,否则性能不同。正如评论中提到的那样,这并不重要,因为无论如何结果都是不同的。

  • WHERE当它确实是一个条件时,将过滤器放在子句中会OUTER JOIN隐式地取消条件的OUTER性质(“即使没有记录也加入”),因为这些过滤器意味着首先必须存在现有记录。例子:

... table1 t LEFT JOIN table2 u ON ... AND t2.column = 5是正确的

... table1 t LEFT JOIN table2 u ON ... 
WHERE t2.column = 5 

是不正确的,因为它t2.column = 5告诉引擎来自 t2 的记录是预期的,这与外部连接背道而驰。例外情况是IS NULL过滤器,例如WHERE t2.column IS (NOT) NULL(这实际上是构建条件外连接的便捷方式)

  • LEFT并且RIGHT连接是隐式OUTER连接。

希望它有所帮助。

于 2013-03-18T18:11:39.450 回答
7

JOIN条件通常应独立于过滤条件。您使用 定义您的加入规则(如何ON。你过滤想要的WHERE。就性能而言,所有发动机和设计都没有通用规则,因此您的行驶里程会有很大差异。

于 2013-03-18T18:10:24.903 回答
0

I think the faster way is to put the filter in the where clause, because it will procees that filter in the where first , and then the join clause, so there will be no need of permutation of filters.

于 2014-01-24T20:28:46.957 回答