如果运行速度更快,那么将WHERE子句的一部分移动到HAVING子句是否错误



在我不使用聚合的长而复杂的查询中,我将其中一个ANDed where子句移到了一个新的HAVING子句中。

从逻辑上讲,结果是相同的,行在返回之前经过筛选。

从语义上讲,结果可能在某些方面有所不同,我不理解。

但就性能而言,它的运行速度要快3倍。我知道这是因为我搬家的事情是做一个昂贵的NOT EXISTS (SELECT ...)。以前,服务器会花时间评估可以使用其他更简单规则排除的行。

这种优化方法是否违反了任何官方或非官方规则

没有这样的规则。

由于联接位于WHERE子句之前,因此可以减少将根据WHERE子句进行检查的行数。

它通常有点讨好,因为你可能会错过一些需要的行。

所以基本上你可以做到,但必须检查,如果所有想要的行都在那里。

  • WHERE子句ANDed在一起的顺序-->优化器(如果可以自由重新排列)
  • 也有一些例外:先搜索FULLTEXT;子查询最后。(我不确定。)
  • 引用聚合-->必须在HAVING
  • 否则CCD_ 8和CCD_ 9具有相同的语义
  • CCD_ 10在逻辑上在CCD_ 11之前完成;CCD_ 12在之后完成
  • 似乎你已经发现,如果NOT EXISTS在其他测试之后以某种方式被迫出现,它会更有效率;并且将其移动到CCD_ 14似乎已经实现了这一点

提交一份错误报告(jira.mariadb.com),表明您发现优化器没有像它应该的那样处理子句。

如果您向我们展示实际的查询,我们也许可以更深入地了解。

相关内容

  • 没有找到相关文章

最新更新