【发布时间】:2020-12-18 12:50:31
【问题描述】:
我在 postgres 中有这个经常性的 SQL 查询:
SELECT b.name, COUNT(*)
FROM a JOIN b ON a.x = b.x
WHERE a.value = some_value
GROUP BY b.name;
(计算每个 b.name 的 a.value 出现次数)
有助于提高查询效率的最佳索引是什么?我假设 a.value 上的哈希索引会有所帮助。但是group by呢?有没有一些复合索引解决方案?还是另一种解决方案?
【问题讨论】:
-
你真的想在这里加入吗?如果 A 中有多个行与(隐藏)连接条件匹配,则 B 中的行将被计算多次。
-
这是 postgres,谢谢我编辑了帖子。关于连接,是的,重点是计算匹配的多次出现。自然连接只是代表主键-外键关系。
-
"自然连接只是代表主键 - 外键关系" - 不,它没有。它连接具有相同 name 的 所有 列,而不是基于声明的外键。
-
对,我没有将它作为自然连接,我只是将它放在这篇文章中以简化查询,但我现在明白它也与问题相关,因此我将对其进行编辑。
-
a.value = some_value的选择性如何?请在查询当前运行时显示EXPLAIN (ANALYZE)计划。
标签: sql postgresql indexing group-by