查询性能 - INNER Join 过滤

Query performance - INNER Join filtering

我想弄清楚哪个查询会更快。我认为首先完成 JOINS,然后是 WHERE 原因。

所以,听起来像这样:

SELECT * 
FROM Table1 t1
INNER JOIN Table2 t2
  ON t1.field = t2.field
  AND t2.Deleted = 0
INNER JOIN Table2 t3
  ON t2.field = t3.field
  AND t3.Deleted = 0
WHERE t1.Deleted = 0

会快于:

SELECT * 
FROM Table1 t1
INNER JOIN Table2 t2
  ON t1.field = t2.field
INNER JOIN Table2 t3
  ON t2.field = t3.field
WHERE
  t1.Deleted = 0 AND
  t2.Deleted = 0 AND
  t3.Deleted = 0

第一个查询中的连接会更早地过滤掉数据,因此连接更少。

(我知道当你有 LEFT 连接时 thi8s 可能会不同)

请注意,您提供的 WHERE 子句的格式为 Conjunctive Normal Form。每当您的查询有简单的比较或相等项加入联合范式时,如果优化器没有执行从样式 2 到样式 1 的转换,那么优化器将完全疏忽。我相信可以安全地假设所有成熟的优化器 SQL 产品能够有效地优化析取范式或联合范式中的简单谓词。

但是,在某个时刻优化器必须停止分析查询并开始构建优化查询。在您的过滤器子句很复杂的情况下,通过在正确的子查询中定位子句来帮助优化器可能会有好处。

但是,除非查询实际测试为非性能,否则通常不会执行此步骤。人力比 CPU 周期贵得多,其中包括人类在代码审查和维护过程中阅读代码所花费的时间。在查询被证明性能不佳到需要手动调整的地步之前,最好将过滤条件保留在 WHERE 子句中,这样可以很容易地识别和验证它们