为什么PostgreSQL 9.5的CUBE,ROLLUP和GROUPING SETS比等效的UNION慢?

时间:2016-02-04 20:19:28

标签: sql postgresql postgresql-performance rollup grouping-sets

我已经非常期待新的PostgreSQL 9.5功能,并且很快就会升级我们的数据库。但是当我发现

时,我感到非常惊讶
String.collect (string >> function
    | vowel when "aeiouyåäöAEIOUYÅÄÖ".Contains vowel -> vowel
    | consonant -> consonant + "o" + consonant )

对我们的数据集的查询实际上比等效数据的查询持续时间总和慢得多(~3秒)(对于所有4个查询总共约1秒,每个查询100-300毫秒)。 col1和col2都有索引。

这是否预期(意味着该功能更多是关于兼容性而不是现在的性能)?或者它可以以某种方式调整?

以下是关于真空生产表的示例:

SELECT col1, col2, count(*), grouping(col1,col2) 
FROM table1 
GROUP BY CUBE(col1, col2)

总时间可比,但后者使用四次扫描,不应该慢一点吗? 使用rollup()时“在磁盘上进行外部合并”很奇怪,我将work_mem设置为16M。

2 个答案:

答案 0 :(得分:1)

有趣,但在那个特定的例子SET work_mem='32mb'摆脱了磁盘合并,现在使用ROLLUP比相应的联合快2倍。

解释分析现在包含:“排序方法:快速排序记忆:19301kB”

我仍然想知道为什么只有400行输出需要这么多内存,以及为什么磁盘合并需要7Mb而不是19Mb内存(快速排序开销?),但我的问题已经解决了。

答案 1 :(得分:0)

似乎分组集总是在查询计划中使用SortAggregate和Sort。 但标准组按频率使用HashAggragate。