Search Postgresql Archives

Re: Poor performance when using a window function in a view

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 01/03/2013 00:19, Chris Hanks wrote:
> On Thu, Feb 28, 2013 at 6:00 AM, Tom Lane <tgl@xxxxxxxxxxxxx
> <mailto:tgl@xxxxxxxxxxxxx>> wrote:
> 
>     Chris Hanks <christopher.m.hanks@xxxxxxxxx
>     <mailto:christopher.m.hanks@xxxxxxxxx>> writes:
>     > 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;
> 
>     To use the outer WHERE clause as an index constraint, postgres would
>     have to prove that scanning only the rows with fkey1 = 1263 would still
>     find all the rows that would get examined by the window functions ---
>     and in this case, it's not only the window functions that make that less
>     than obvious, but the grouped aggregates in the sub-select below them.
>     There's not nearly that amount of intelligence in the system about
>     window functions, as yet.  So you'll have to write out the query
>     longhand and put the WHERE clause at the lower level, if you want this
>     optimization to happen.
> 
>                             regards, tom lane
> 
> 
> Ok, that makes sense, thanks.
> 
> Can anyone point me to an example of wrapping a function in a view, like
> Merlin suggested? I'm not sure how that would work.

Off the top of my head, I'd imagine it's as simple as:

  create view ... as
  select * from my_function(...);

:-)

Ray.


-- 
Raymond O'Donnell :: Galway :: Ireland
rod@xxxxxx


-- 
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux