SQLite函数调用是否记忆化?两类分组查询性能差异问询
关于两个SQL查询的性能差异解答
放心,这两个查询的性能完全没有区别——SQLite(以及绝大多数现代关系型数据库)的查询优化器会智能处理这种情况,不会让count(x)被计算两次。
具体原因如下:
- 优化器会自动识别:HAVING子句里的
count(x)和SELECT列表中的count(x)是针对同一分组的同一个聚合计算,它会直接复用已经计算好的结果,不会重复执行统计操作。 - 使用
AS xcnt给聚合结果起别名,只是让代码更易读、更清晰,本质上和写两次count(x)的执行逻辑完全一致,不会带来性能上的差异。 - 你可以通过执行计划验证这一点:对两个查询分别运行
EXPLAIN QUERY PLAN,会得到完全相同的输出。比如针对你的测试环境,两个查询的执行计划都会是:
这说明数据库执行它们的步骤完全一样,没有额外的重复计算。QUERY PLAN `--SCAN TABLE foos `--USE TEMP B-TREE FOR GROUP BY
补充说明
两种写法最终的输出结果也完全一致,都是:
1|3 2|2
内容的提问来源于stack exchange,提问作者solstice333
相关产品推荐
相关产品推荐

