Re: Queries slow using stored procedures

From: John Meinel <john(at)johnmeinel(dot)com>
To: Rod Dutton <rod(at)e-rm(dot)co(dot)uk>
Cc: pgsql-performance(at)postgresql(dot)org
Subject: Re: Queries slow using stored procedures
Date: 2004-10-24 18:25:49
Message-ID: 417BF3AD.6010901@johnmeinel.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

Rod Dutton wrote:
>
> Hi,
>
> Has anybody got any ideas on my recent posting ? (thanks in advance) :-
>
>
> I have a problem where a query inside a function is up to 100 times
> slower inside a function than as a stand alone query run in psql.
>
> The column 'botnumber' is a character(10), is indexed and there are
> 125000 rows in the table.
>

[...]

I had a similar problem before, where the function version (stored
procedure or prepared query) was much slower. I had a bunch of tables
all with references to another table. I was querying all of the
references to see if anyone from any of the tables was referencing a
particular row in the base table.

It turned out that one of the child tables was referencing the same row
300,000/500,000 times. So if I happened to pick *that* number, postgres
wanted to a sequential scan because of all the potential results. In my
testing, I never picked that number, so it was very fast, since it knew
it wouldn't get in trouble.

In the case of the stored procedure, it didn't know which number I was
going to ask for, so it had to plan for the worst, and *always* do a
sequential scan.

So the question is... In your table, does the column "botnumber" have
the same value repeated many, many times, but '1-7' only occurs a few?

If you change the function to:

CREATE OR REPLACE FUNCTION sp_test_rod3 ( ) returns integer
as '
DECLARE
bot char(10);
oldbatch INTEGER;
BEGIN

SELECT INTO oldbatch batchserial
FROM transbatch
WHERE botnumber = ''1-7''
LIMIT 1;

IF FOUND THEN
RETURN 1;
ELSE
RETURN 0;
END IF;

END;
'
language plpgsql ;

Is it still slow?

I don't know if you could get crazy with something like:

select 1 where exist(select from transbatch where botnumber = '1-7'
limit 1);

Just some thoughts about where *I've* found performance to change
between functions versus raw SQL.

You probably should also mention what version of postgres you are
running (and possibly what your hardware is)

John
=:->

In response to

Browse pgsql-performance by date

  From Date Subject
Next Message John Meinel 2004-10-24 19:08:59 Re: Queries slow using stored procedures
Previous Message Rod Dutton 2004-10-24 18:13:23 Queries slow using stored procedures