虽然这个问题是针对MySQL的,但我不介意知道这个答案是否适用于SQL引擎。
此外,由于这不是语法查询,我使用psuedo-SQL是为了简洁/清晰。
假设C [1] .. C [M]是一组标准(由AND或OR分隔)和Q [1] .Q [N]是另一组(由OR分隔)。我想用C [1] ... C [M]来过滤一个表,从这个过滤后的表中,我想要所有符合Q [1] ...... Q [N]的行。
如果我这样做:
SELECT ... FROM ... WHERE (C[1]...C[M]) AND (Q[1]...Q[N])
这是否会自动优化,以便只找到一次C [1] ... C [M]并且每个Q [i]都针对此缓存结果运行?如果没有,我是否应该将查询拆分为两个:
INSERT INTO TEMP ... SELECT ... FROM ... WHERE C[1]...C[N]
SELECT ... FROM TEMP WHERE Q[1]...Q[N]
答案 0 :(得分:0)
这是内部查询优化器的工作,用于计算根据过滤器编译连接的最佳顺序。
例如:
SELECT *
FROM
table1
INNER JOIN table2 ON table1.id = table2.id AND table2.column = Y
INNER JOIN table3 ON table3.id2 = table2.id2 AND table3.column = Z
WHERE
table1.column = X
Mysql(/ oracle / sqlserver等...)尝试预先计算每个中间结果集以提供最佳性能,实际上这里的引擎做得非常好。
但是,一切都依赖于它实际上有关表和您在架构中设置的索引的统计信息。这两点(除了用数据填充表格......)是唯一可以影响的点,通过为其提供正确和准确的信息来帮助优化器做出正确的决策。
我希望它有所帮助。
ps:看看这个。这是关于oracle下的查询编译中的运算符和优先顺序,但无论如何都可能是一件好事:
http://ezinearticles.com/?Oracle-SQL---The-Importance-of-Order-of-Precedence&id=1597846