我想知道哪个查询会更快。我认为首先完成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会有所不同)
答案 0 :(得分:2)
请注意,您提供的WHERE子句采用名为Conjunctive Normal Form的形式。每当您的查询具有简单比较或以联合范式连接的相等项时,如果优化器没有执行从样式2到样式1的转换,则优化器将完全疏忽。我相信可以安全地假设所有成熟SQL的优化器产品能够以析取或联合正态形式有效地优化简单谓词。
但是,在某个时刻,优化器必须停止分析查询并开始构建优化查询。如果您的过滤子句很复杂,那么通过在正确的子查询中查找子句来帮助优化器可能会有好处。
但是,除非查询实际测试为非性能,否则通常不会执行此步骤。人工劳动比CPU周期昂贵得多,其中包括人类在阅读代码时花费的时间,作为代码审查和维护的一部分。在查询被证明无法满足要求手动调整的要求之前,最好将过滤术语保留在WHERE子句中,以便于识别和验证它们