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
从理论上说,不,它不应该更快.查询优化器应该能够生成相同的执行计划.但是,一些数据库引擎可以为其中一个生成更好的执行计划(这种简单查询不太可能发生,但对于复杂的查询而言).您应该测试两者并查看(在您的数据库引擎上).
Mik*_*e J 18
"JOIN"与"WHERE"的表现......一切都取决于数据库引擎能够为您优化查询的程度.它将考虑您在返回的列上可能具有的任何索引,并认为WHERE和JOIN子句的性能也归结为物理数据库文件本身及其碎片级别,甚至是用于存储数据库文件的存储技术. .
MSSql服务器按以下顺序执行查询(这应该让您了解WHERE和JOIN子句的功能)
以下摘自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子句中的连接条件,最终会出现令人讨厌的交叉连接.