JOIN比WHERE更快吗?

Woo*_*kai 55 sql performance join where-clause

假设我有两个链接的表(一个具有另一个的外键):

CREATE TABLE Document (
  Id INT PRIMARY KEY,
  Name VARCHAR 255
)

CREATE TABLE DocumentStats (
  Id INT PRIMARY KEY,
  DocumentId INT, -- this is a foreign key to table Document
  NbViews INT
)
Run Code Online (Sandbox Code Playgroud)

我知道,这不是最聪明的做事方式,但这是我能想到的最好的例子.

现在,我想获得拥有超过500个视图的所有文档.我想到的两个解决方案是:

SELECT *
FROM Document, DocumentStats
WHERE DocumentStats.Id = Document.Id
  AND DocumentStats.NbViews > 500
Run Code Online (Sandbox Code Playgroud)

要么 :

SELECT *
FROM Document
INNER JOIN DocumentStats
ON Document.Id = DocumentStats.Id
WHERE DocumentStats.NbViews > 500
Run Code Online (Sandbox Code Playgroud)

两个查询都是等价的,还是有一种方法比另一种更好?如果是这样,为什么?

我知道我的例子并不完美,而且查询可能需要一些调整,但我希望你明白这一点;)!

编辑:根据答案中的要求,这个问题针对MSSQL,但我有兴趣知道它是否与其他数据库引擎不同(MySQL等...)

Meh*_*ari 43

从理论上说,不,它不应该更快.查询优化器应该能够生成相同的执行计划.但是,一些数据库引擎可以为其中一个生成更好的执行计划(这种简单查询不太可能发生,但对于复杂的查询而言).您应该测试两者并查看(在您的数据库引擎上).

  • +1用于推荐测试OP的特定情况.分析胜过王牌. (4认同)
  • 我同意。我经常尝试查询的 JOIN 和 WHERE 版本,看看哪个版本性能最好。有时 JOIN 更快,有时 WHERE - 这取决于查询。 (2认同)

Mik*_*e J 18

"JOIN"与"WHERE"的表现......一切都取决于数据库引擎能够为您优化查询的程度.它将考虑您在返回的列上可能具有的任何索引,并认为WHERE和JOIN子句的性能也归结为物理数据库文件本身及其碎片级别,甚至是用于存储数据库文件的存储技术. .

MSSql服务器按以下顺序执行查询(这应该让您了解WHERE和JOIN子句的功能)

Microsoft Sql Server查询流程订单

以下摘自Microsoft SQL Server 内部优秀系列丛书,内部Microsoft SQL Server 2005:T-SQL查询,可在此处找到

(步骤8)SELECT(步骤9)DISTINCT(步骤11)
(步骤1)FROM left_table
(步骤3) join_type JOIN right_table
(步骤2)ON join_condition
(步骤4)WHERE where_condition
(步骤5)GROUP BY group_by_list
(步骤6) WITH [CUBE | ROLLUP]
(步骤7)HAVING having_clause
(步骤10)ORDER BY order_by_list


Sam*_*ron 12

在不限制目标数据库的情况下无法正确回答这个问题.

对于MS-SQL,两个查询都会生成相同的执行计划,但请记住:

SELECT *
FROM Document, DocumentStats
WHERE DocumentStats.Id = Document.Id
  AND DocumentStats.NbViews > 500
Run Code Online (Sandbox Code Playgroud)

真的很冒险,因为很容易忘记WHERE子句中的连接条件,最终会出现令人讨厌的交叉连接.