Using a window function in a view

From: Chris Hanks <christopher(dot)m(dot)hanks(at)gmail(dot)com>
To: pgsql-performance(at)postgresql(dot)org
Subject: Using a window function in a view
Date: 2013-02-21 23:37:10
Message-ID: CAK7KUdBm_r9ikvEm4TFioXfQYuQVVFNAMiVV+O0Z3etBQ_H5dA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

I'm trying to create a view that uses a window function, but it seems that
Postgres is apparently unable to optimize it. Here's a reproduction of my
situation with 9.2.2:

---

drop table if exists values cascade; create table values ( fkey1 integer
not null, fkey2 integer not null, fkey3 integer not null, value float not
null, constraint values_pkey primary key (fkey1, fkey2, fkey3) ); -- Kind
of hacky, but it roughly resembles my dataset. insert into values select
distinct on (fkey1, fkey2, fkey3) i / 12 + 1 as fkey1, i % 4 + 1 as fkey2,
ceil(random() * 10) as fkey3, random() * 2 - 1 as value from
generate_series(0, 199999) i; create or replace view values_view as select
fkey1, fkey3, (derived1 / max(derived1) over (partition by fkey1)) as
derived1, (derived2 / sum(derived1) over (partition by fkey1)) as derived2
from ( select fkey1, fkey3, cast(sum((case when (value > 0.0) then 4 else 1
end)) as double precision) as derived1, sum((case when (value > 0.0) then
(value * 4) else (value + 1) end)) as derived2 from values group by fkey1,
fkey3 ) as t1;
-- This query requires a sequential scan on values, though all the data it
needs could be found much more efficiently with an index scan. explain
analyze select * from values_view where fkey1 = 1263;

---

Can anyone suggest a way to rewrite this query, or maybe a workaround of
some kind?

Thanks, Chris

Browse pgsql-performance by date

  From Date Subject
Next Message Markus Schulz 2013-02-22 08:25:23 BUG: endless lseek(.., SEEK_END) from select queries on x64 builds
Previous Message Alexander Staubo 2013-02-21 19:44:27 Bad query plan with high-cardinality column