Re: Queries slow using stored procedures
От | John Meinel |
---|---|
Тема | Re: Queries slow using stored procedures |
Дата | |
Msg-id | 417BF3AD.6010901@johnmeinel.com обсуждение исходный текст |
Ответ на | Queries slow using stored procedures ("Rod Dutton" <rod@e-rm.co.uk>) |
Список | 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 =:->
Вложения
В списке pgsql-performance по дате отправления: