Re: Slow index creation
От | hubert depesz lubaczewski |
---|---|
Тема | Re: Slow index creation |
Дата | |
Msg-id | 20210217184808.GA14032@depesz.com обсуждение исходный текст |
Ответ на | Slow index creation (Paul van der Linden <paul.doskabouter@gmail.com>) |
Ответы |
Re: Slow index creation
|
Список | pgsql-general |
On Tue, Feb 16, 2021 at 07:30:23PM +0100, Paul van der Linden wrote: > Hi, > I have 2 functions: > CREATE FUNCTION foo(a text, b text, c text) RETURNS text AS > $func$ > DECLARE > retVal text; > BEGIN > SELECT > CASE > WHEN a='v1' AND b='b1' THEN 'r1' > WHEN a='v1' THEN 'r2' > ... snip long list containing various tests on a,b and c > WHEN a='v50' THEN 'r50' > END INTO retval; > RETURN retVal; > END > $func$ LANGUAGE PLPGSQL IMMUTABLE; If this function was converted to SQL function it could be faster, as it could be inlined. > CREATE FUNCTION bar(r text, geom geometry) RETURNS int AS > $func$ > DECLARE > retVal int; > BEGIN > SELECT > CASE > WHEN r='r1' AND st_area(geom)>100 THEN 1 > WHEN r='r1' THEN 2 > ... snip long list containing various tests on r and st_area(geom) > WHEN r='r50' THEN 25 > END INTO retval; > RETURN retVal; > END > $func$ LANGUAGE PLPGSQL IMMUTABLE; First thing that I notice is that it seems (from the code and comment) that you run st_area(geom) multiple times. If that's really the case - why don't you cache it in some variable? declare v_area float := st_area( geom ); begin ... and then use v_area instead of st_area(geom) depesz
В списке pgsql-general по дате отправления: