2009-08-05 50 views
2

加入两个表时,下面两个块之间有什么区别,哪个更好?你写了哪个SQL?

模式A:

SELECT ... 
FROM A 
    INNER JOIN B 
     ON A.PK = B.FK 
WHERE 1=1 
    AND A.Name = "Foo" 
    AND B.Title = "Bar" 

模式B:

SELECT ... 
FROM A 
    INNER JOIN B 
     ON A.PK = B.FK 
      AND B.Title = "Bar" 
WHERE 1=1 
    AND A.Name = "Foo" 
+2

我会认为查询优化器并不在乎;但我不是大师...... – balpha 2009-08-05 16:29:46

+0

@balpha:只适用于* INNER *连接。外部连接有区别。确切地说,是 – Sung 2009-08-06 05:09:08

回答

13

这将会从因人而异,但我认为这一投资模式的比较好。

它所做的是将表级联接与筛选器分开。这对于具有多个连接和多个过滤器的查询会很有帮助,因为它清楚地区分了正在进行的两种连接类型。

+0

。 ON最初被引入以将过滤器的连接条件分开。 – Powerlord 2009-08-05 16:37:34

4

我更喜欢模式A,但可能没有任何区别。为了确保它能够高效运行,您必须查看执行计划。

0

我可能是错的,但我认为第一种方法更有效。你的查询是从内到外执行的。所以当你首先运行你的连接时,它会跑得更快,只是因为它必须匹配(可能是索引的)FK字段,而不是像你的标题字段(这可能是一个varchar,使匹配更慢)无关的任何东西。所以,当你到达你的过滤where子句时,你有更少的数据来执行匹配。总推测虽然。我不知道别人会说什么。不会伤害看到这个执行计划:)

+1

与良好的查询引擎配对时,如何写查询不应与查询的运行方式相关。对于较老的,不太聪明的查询引擎,情况可能如此。 – 2009-08-05 16:45:32

3

如果您将INNER JOIN替换为OUTER JOIN,将有所不同。

否则,这些查询:

SELECT ... 
FROM A 
INNER JOIN 
     B 
ON  A.PK = B.FK 
WHERE A.Name = "Foo" 
     AND B.Title = "Bar" 

SELECT ... 
FROM A 
INNER JOIN 
     B 
ON  A.PK = B.FK 
     AND B.Title = "Bar" 
WHERE A.Name = "Foo" 

SELECT * 
FROM A, B 
WHERE B.Title = "Bar" 
     AND A.Name = "Foo" 
     AND A.PK = B.FK 

是相同的。

Oracle,MySQL,PostgeSQLSQL Server将对待他们完全一样,并使用完全相同的计划为他们所有。如果在B.FK单列关键,而这一次

SELECT ... 
FROM A 
INNER JOIN 
     B 
ON  B.FK = A.PK 
WHERE A.Name = "Foo" 
     AND B.Title = "Bar" 

SELECT ... 
FROM A 
INNER JOIN 
     B 
ON  B.FK = A.PK 
     AND B.Title = "Bar" 
WHERE A.Name = "Foo" 

如果在(B.FK, B.title)复合键

我会用这一个。

在这种情况下,连接条件更直观。

+0

如果你使用外部连接作为第一种模式,将外部连接转换为内部连接,而第二种模式不会,那么你对于存在差异是非常正确的,因此结果将会非常不同。 – HLGEM 2009-08-05 16:44:34

相关问题