Optimizer Doesn't Push Down Where Expressions on Rollups

From: Logan Bowers <logan(dot)bowers(at)gmail(dot)com>
To: pgsql-bugs(at)lists(dot)postgresql(dot)org
Subject: Optimizer Doesn't Push Down Where Expressions on Rollups
Date: 2020-03-09 21:05:27
Message-ID: 17F738BE-8D45-422C-BAD0-ACA3090BF46D@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

Hello,

I’m running into a performance issue where I’m trying to introduce a rollup into GROUP BY clause. I believe the query planner is missing an optimization when grouping by multiple terms.

Here’s an example that replicates the problem:

BEGIN;
CREATE TABLE limitation_demo (c1 integer, c2 integer, c3 integer, c4 integer);

INSERT INTO limitation_demo SELECT
(random() * 20)::integer,
(random() * 20)::integer,
(random() * 20)::integer,
(random() * 20)::integer
FROM generate_series(0,10000) AS foo;

CREATE INDEX idx1 ON limitation_demo (c1, c2, c3);

--Good
EXPLAIN SELECT * FROM (SELECT c1,c2,c3, sum(c4) FROM limitation_demo GROUP BY c1,c2,c3) AS foo WHERE c1 = 1 AND c2 = 5 ;
--Bad
EXPLAIN SELECT * FROM (SELECT c1,c2,c3, sum(c4) FROM limitation_demo GROUP BY c1, c2, ROLLUP(c3)) AS foo WHERE c1 = 1 AND c2 = 5;
ROLLBACK;

Here are the respective query plans:

QUERY PLAN
-----------------------------------------------------------------------------------
GroupAggregate (cost=0.29..8.32 rows=1 width=20)
Group Key: limitation_demo.c1, limitation_demo.c2, limitation_demo.c3
-> Index Scan using idx1 on limitation_demo (cost=0.29..8.30 rows=1 width=16)
Index Cond: ((c1 = 1) AND (c2 = 5))
(4 rows)

QUERY PLAN
----------------------------------------------------------------------------
HashAggregate (cost=255.02..360.03 rows=2 width=20)
Hash Key: limitation_demo.c1, limitation_demo.c2, limitation_demo.c3
Hash Key: limitation_demo.c1, limitation_demo.c2
Filter: ((limitation_demo.c1 = 1) AND (limitation_demo.c2 = 5))
-> Seq Scan on limitation_demo (cost=0.00..155.01 rows=10001 width=16)
(5 rows)

Despite being semantically equivalent, I believe, the latter plan with the rollup does not use the index. I believe what is happening is that the WHERE clause is getting pushed down into the inner query without the ROLLUP, but is not with the ROLLUP.

This is a simplified example. In my real-world use case, the inner query is a view, so I don’t have the option of moving the where clause.

Can y’all let me know if I should submit this somewhere else? Thanks!

Browse pgsql-bugs by date

  From Date Subject
Next Message Andres Freund 2020-03-09 22:09:30 Re: BUG #16285: bt_metap fails with value is out of range for type integer
Previous Message Tom Lane 2020-03-09 16:25:33 Re: select big table postgresql crash