Re: pl-pgsql "return set of..." "return next..." performance question - Mailing list pgsql-general

From Pavel Stehule
Subject Re: pl-pgsql "return set of..." "return next..." performance question
Date
Msg-id 162867790711161249s33a0d0cava62fa65f2e63abfd@mail.gmail.com
Whole thread Raw
In response to Re: pl-pgsql "return set of..." "return next..." performance question  ("Gauthier, Dave" <dave.gauthier@intel.com>)
List pgsql-general
On 16/11/2007, Gauthier, Dave <dave.gauthier@intel.com> wrote:
> I don't think so.  Here's why....
>
> As an experiment, I created another temp table with records identical to
> what will be returned in the set.  Then I loaded that temp table with
> all the results to be returned.  And finally, I returned * from that
> table.  I inserted "raise notice" statements to monitor progress.
>
> The query runs just as fast inside pl-pgsql as it did in psql (very very
> fast).  But returning * from that table takes a good 10 seconds.  (There
> are
> only 145 records in the table).
>

Then some is broken :(.

loop over return next has come cost, but not too much.

postgres=# create table foot(a integer);
CREATE TABLE
postgres=# insert into foot select i from generate_series(1,100000) g(i);
INSERT 0 100000
postgres=# create or replace function rs() returns setof integer as
$$declare i integer; begin for i in select a from foot loop return
next i; end loop; return; end; $$ language plpgsql;
CREATE FUNCTION
postgres=# select * from rs() limit 10;
 rs
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
(10 rows)

postgres=# \timing
Timing is on.
postgres=# select count(*) from (select * from rs) a;
ERROR:  relation "rs" does not exist
postgres=# select count(*) from (select * from rs()) a;
 count
--------
 100000
(1 row)

Time: 327,740 ms
postgres=#

Pavel


> :-(
>
>
> -----Original Message-----
> From: Pavel Stehule [mailto:pavel.stehule@gmail.com]
> Sent: Friday, November 16, 2007 1:16 PM
> To: Gauthier, Dave
> Cc: pgsql-general@postgresql.org
> Subject: Re: [GENERAL] pl-pgsql "return set of..." "return next..."
> performance question
>
> Hello
>
> >
> >  I noticed that it takes a long time to return the set of records. But
> if I
> > run the same query at the psql cli, it runs blindingly fast.  So it
> appears
> > that the process of returning the records via "return next" is the
> > performance culprit.
> >
> > Any ideas?
>
> Try use holdable cursors
> http://www.postgresql.org/docs/8.2/interactive/plpgsql-cursors.html#PLPG
> SQL-CURSOR-USING
>
> But problem can be in
> http://groups.google.com/group/pgsql.general/browse_thread/thread/38aa20
> 64fcce53ed/69b7362839c3ab4c
>
> Regards
> Pavel Stehule
>

pgsql-general by date:

Previous
From: "Gauthier, Dave"
Date:
Subject: Re: pl-pgsql "return set of..." "return next..." performance question
Next
From: "Ed L."
Date:
Subject: view management