在评估创建SQL
视图查询的性能时,我注意到在末尾添加WHERE
子句时性能有了显着提高。输出差异不大(行减少约3%)。
例如
SELECT x,y,z
FROM (multiple table joins/sub queries)
vs
SELECT x,y,z
FROM (multiple table joins/sub queries)
WHERE x >= 0 (x is not indexed)
检查执行计划,似乎最大的不同是WHERE
条件避免了全表扫描,这可以解释速度上的差异。为什么会这样?
编辑:屏幕截图显示了在有条件条件下与没有条件条件下的执行操作
答案 0 :(得分:1)
(即使有屏幕截图,也没有足够的信息来智能地答复。但是我可以猜测...)
面对JOIN(s)
时,优化器经常(但并非总是)使用以下规则来确定以哪个表开头:
从似乎具有最佳WHERE
过滤的表开始。可能 导致它选择了其中带有x
的桌子。即使是全表扫描,选择该表也可能更好。
从“最小”表开始。
注意:它将扫描“第一个”表;对于该表中的每一行,它会到达“下一个”表,然后进入下一个表,依此类推。Optimizer可以根据需要自由地对表重新排序(在LEFT
这样的约束内)。
实际上,Optimizer的后续版本使用“基于成本”的分析。但是,以上两个“规则”是有效发生的。
此外,优化程序可能会因其基于查询计划的统计信息而被误导。