Re: Custom function problems

From: Stephan Szabo <sszabo(at)megazone(dot)bigpanda(dot)com>
To: Michael Glaesmann <grzm(at)myrealbox(dot)com>
Cc: pgsql-novice(at)postgresql(dot)org
Subject: Re: Custom function problems
Date: 2003-10-21 15:31:53
Message-ID: 20031021081503.U42943@megazone.bigpanda.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-novice


On Tue, 21 Oct 2003, Michael Glaesmann wrote:

> I've been working on increasing the performance of a large query by
> writing a function that returns a table summary. The original table is
>
> orders (product_code TEXT FK products(id), date DATE, branch_id INTEGER
> FK branches(id), qty INTEGER)
>
> I'd like to get a summary of total qty sold for each item during a
> given period, such as
>
> select product_code, qty from orders
> where date between '2003-07-01' and '2003-07-31'
> group by product_code
>
> So I made this function:
>
> create function orders_monthly(date) returns orders_sum_qty as '
> select product_code, sum(qty)::integer as qty from orders
> where date between $1 and ($1::date _ ''1 month'' - ''1day''::interval)
> group by product_code
> ' language sql;

I think you want setof orders_sum_qty for the return type (otherwise
you're only returning one row as below). I'd also wonder if this ends up
using a sequence scan rather than an index scan because it doesn't know
which will be better for an arbitrary $1 which might explain a difference
in performance.

How does the following run in comparison?

create or replace function orders_monthly(date) returns setof
orders_sum_qty as '
DECLARE
r record;
BEGIN
FOR r IN EXECUTE
''select product_code, sum(qty)::integer as qty from orders where
date between '''''' || $1 || '''''' and ('''''' || $1 || ''''''::date +
''''1 month''''::interval - ''''1 day''''::interval) group by product_code''
LOOP
RETURN NEXT r;
END LOOP;
RETURN;
END;' language 'plpgsql';

In response to

Browse pgsql-novice by date

  From Date Subject
Next Message Josh Berkus 2003-10-21 16:48:19 Re: Many joins: monthly summaries S-L--O--W
Previous Message jclaudio 2003-10-21 13:37:16 how to create a multi columns return function ?