From: | "Vladimir Sitnikov" <sitnikov(dot)vladimir(at)gmail(dot)com> |
---|---|
To: | "David Rowley" <dgrowley(at)gmail(dot)com> |
Cc: | "Hitoshi Harada" <umi(dot)tanuki(at)gmail(dot)com>, pgsql-hackers(at)postgresql(dot)org, heikki(dot)linnakangas(at)enterprisedb(dot)com |
Subject: | Re: Windowing Function Patch Review -> Performance Comparison. |
Date: | 2008-11-02 00:53:14 |
Message-ID: | 1d709ecc0811011753g274a34aer36d1f172c2e09ce@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Here is another way to solve "big marathon" without window functions (and
many other kinds of "windowing" queries, especially those that do not
specify "rows preceeding" etc.).
It could be considered as a very dirty hack, however it could give you an
insight on the performance of the "windowed" query with indexscan instead of
seqscan.
create function var_set (text,text) returns text
as
'
select set_config (''public.''||$2||pg_backend_pid(), $1, false);
' LANGUAGE 'sql';
create function var_get (text) returns text
as
'
select current_setting(''public.''||$1||pg_backend_pid());
' LANGUAGE 'sql';
create operator >>> (procedure = var_set, leftarg = text, rightarg = text);
create operator <<< (procedure = var_get, rightarg = text);
-- init values
select ''>>>'prev_time', '0'>>>'dense_rank';
-- marathon query
select *
from (
select (((case when time::text = <<<'prev_time' then *0* else *1*
end)+(<<<'dense_rank')::int4)::text>>>'dense_rank')::int4 as position,
runnerid, time
from big_marathon
order by time
) results
where position=*2*
Best regards,
Vladimir Sitnikov
From | Date | Subject | |
---|---|---|---|
Next Message | Robert Haas | 2008-11-02 01:36:16 | Re: Well done, Hackers |
Previous Message | Joshua D. Drake | 2008-11-02 00:26:00 | Re: Updates of SE-PostgreSQL 8.4devel patches (r1168) |