查询性能 - INNER加入过滤

时间:2015-03-11 00:51:07

标签: sql-server join

我想知道哪个查询会更快。我认为首先完成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会有所不同)

1 个答案:

答案 0 :(得分:2)

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

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

但是,除非查询实际测试为非性能,否则通常不会执行此步骤。人工劳动比CPU周期昂贵得多,其中包括人类在阅读代码时花费的时间,作为代码审查和维护的一部分。在查询被证明无法满足要求手动调整的要求之前,最好将过滤术语保留在WHERE子句中,以便于识别和验证它们