哪种 SQL 查询更快:Join Criteria 还是Where Clause?
这道题比较了两种查询结构的性能:对 join 进行过滤标准与使用 WHERE 子句的比较。常见的假设是,根据连接条件进行过滤会更快,因为它会更早地减少结果集,但这种信念可能并不总是成立。
查询比较
让我们检查两个具有相同结构(过滤器放置除外)的查询:
查询 1(Join 上的过滤器)标准)
SELECT * FROM TableA a INNER JOIN TableXRef x ON a.ID = x.TableAID INNER JOIN TableB b ON x.TableBID = b.ID WHERE a.ID = 1;
查询 2(在 WHERE 子句中过滤)
SELECT * FROM TableA a INNER JOIN TableXRef x ON a.ID = x.TableAID INNER JOIN TableB b ON x.TableBID = b.ID AND a.ID = 1;
性能测试
为了确定哪个查询更快,进行了性能测试。结果表明,WHERE 子句的过滤速度比使用连接条件的过滤速度稍快。经过的时间差很小:
逻辑一致性
虽然性能是一个重要的考虑因素,但逻辑一致性同样重要。 WHERE 子句的过滤与左连接的语义一致。考虑以下查询:
在连接条件上使用过滤器进行左连接
SELECT * FROM TableA a LEFT JOIN TableXRef x ON x.TableAID = a.ID AND a.ID = 1 LEFT JOIN TableB b ON x.TableBID = b.ID;
在 WHERE 子句中使用过滤器进行左连接
SELECT * FROM TableA a LEFT JOIN TableXRef x ON x.TableAID = a.ID LEFT JOIN TableB b ON b.id = x.TableBID WHERE a.id = 1;
在左连接的情况下,WHERE子句过滤器确保只有匹配的行为给定 ID 返回,无论右侧连接是否存在。这种行为在逻辑上是一致的,并且更容易理解。
结论
虽然性能差异可以忽略不计,但 WHERE 子句的过滤速度稍微快一些,逻辑上也更一致,特别是在使用左连接时。因此,一般建议在 WHERE 子句中放置过滤器,以兼顾性能和可读性。
以上是SQL 查询中 WHERE 子句或连接条件过滤速度更快吗?的详细内容。更多信息请关注PHP中文网其他相关文章!