SQL加入类型和性能:跨越vs内部
所以,我在这个网站上看到很多SQL示例。 我有一个关于内部连接(普通JOIN
)和交叉连接( SELECT foo FROM bar,baz WHERE
)的相对性能的问题。 原来这个问题已经被问到:
INNER JOIN ON与WHERE子句
但我仍然有一个问题需要澄清。 我没有看到答案中的任何内容。
问题是这样的:
假定没有字段是NULL。 给定两个等价的查询,其中一个是这样形成的
SELECT * FROM t1
JOIN t2 ON t1.t2_id=t2.t1_id AND t2.bar='baz'
WHERE t1.foo='bar'
一个格式是这样的:
SELECT * FROM t1,t2
WHERE t1.foo='bar' AND t1.t2_id=t2.t1_id AND t2.bar='baz'
他们的执行时间有差异吗? 我特别感兴趣的是对两个表中的值进行限制的情况,除了像行匹配的ID匹配之外。 请注意,此架构中没有外键约束。
我也许应该说我对这个扩展到两个以上的表格感兴趣。
在此先感谢您的答案,SQL专家!
你的第一个例子通常称为显式连接,第二个例子是隐式连接。 在性能方面,它们应该是等价的,至少在流行的DBMS中是这样。
我认为大多数'SQL专家'会更像这样写查询:
SELECT *
FROM t1
INNER JOIN t2
ON t1.t2_id = t2.t1_id
WHERE t1.foo='bar'
AND t2.bar = 'baz';
特别:
INNER JOIN
语法有强烈的偏好(尽管可能选择省略INNER
关键字); JOIN
子句中只放入'join'谓词; WHERE
子句中。 “连接”搜索条件和“过滤器”连接条件之间的区别是主观的,但在实践中存在很多共识。
PS你所谓的'交叉连接'不是:)正如你所说,这两个查询是等价的(如果你愿意,这两个查询都是'逻辑'内部连接),但不使用显式[INNER] JOIN
语法的查询使用所谓的附加符号 。
优化器对内连接标准的重新排序非常容易,并且应该很少有这样的机会 - 但如果统计数据过期,所有投注都关闭,它可能会重新排序它们首先使用具有不良统计数据的表格。 但是,即使您选择了订单,这当然也会影响您。
至少在SQL Server中,优化器通常甚至可以通过视图和内联表值函数向下推内部联接条件,以便尽可能早地进行选择。
链接地址: http://www.djcxy.com/p/15129.html