Обсуждение: Fwd: Calling functions inside a function: behavior

Поиск
Список
Период
Сортировка

Fwd: Calling functions inside a function: behavior

От
"Josh Berkus"
Дата:
Edipo,
> FUNCTION (...) AS '(...)BEGIN 
> PERFORM FUNCTION1(); 
> PERFORM FUNCTION2(); 
> (...) 
> END;' LANGUAGE 'PLPGSQL'; 

I'm not sure about that syntax (PERFORM).  I ususally set my functions
equal to a value ('remote_result := Function1(paramater)').  This has
the added advantage of letting me use an exit value from my sensted
function to communicate with the parent function ('IF remote_result =
'ERROR' THEN ... ').  I'm just not sure what bugaboos you may be running
into with PERFORM.

One possibility (Tom, Jan, verify me on this):  All calls in a function
are automatically nested in a transaction.  Thus, if FunctionM calls
Function1, 2, and 3, then the system should reverse Functions 1, 2, and
3 if M errors out at any point.  This means that all of the changes made
by the nested calls need to be cached somehow; on a slow or low-memory
system, this could lead to bogging down as your machine utilizes its
swap space if Functions 1, 2, and 3 involve heavy data interactions.

One way to test this, is to modify your test script as follows:

BEGIN WORK;
PERFORM Function1;
SELECT current_timestamp;
PERFORM Function2;
SELECT current_timestamp;
etc ...
COMMIT WORK;

If the test script bogs down as well, you have your answer although the
workaround may be tricky to implement.

-Josh Berkus




______AGLIO DATABASE SOLUTIONS___________________________                                      Josh Berkus Complete
informationtechnology      josh@agliodbs.com  and data management solutions       (415) 565-7293 for law firms, small
businesses       fax 621-2533   and non-profit organizations.      San Francisco
 


Re: Fwd: Calling functions inside a function: behavior

От
edipoelder@ig.com.br
Дата:
Em 02 Apr 2001, Josh Berkus escreveu: 

>BEGIN WORK; 
>COMMIT WORK; 
   In time... I think that could be great if postgresql implement a commit 
inside functions. 
   Abracos, 
   Edipo Elder    [edipoelder@ig.com.br] 

_________________________________________________________
Oi! Voc� quer um iG-mail gratuito?
Ent�o clique aqui: http://www.ig.com.br/paginas/assineigmail.html



using for rec inside a function: behavior very slow

От
Jie Liang
Дата:
I have a function:
CREATE FUNCTION hasdup(text) RETURNS int4 AS '
declare  v_id         int4;  rat1         text;  rat2         text;  v_url        text;  rec          record;

begin    select id into v_id from urlinfo where url = $1;    if NOT FOUND then       return -1;    end if;    select
codestr(v_id)into rat1;    v_url:= $1||''%'';                    for rec in select id,url from urlinfo where url like
v_urlorder by
 
url loop       raise notice ''%'',rec.url;          select codestr(rec.id) into rat2;          if rec.id <> v_id and
rat1= rat2 then             update urlinfo set list = 1 where id = rec.id;             return rec.id;           end if;
  end loop;     return 0;
 
end; 
' LANGUAGE 'plpgsql';


'where url like clause' is very slow in inside the function,
but when I directly use this statement in SQL, it is very quick,
is any quick way to return match:
where field like 'something%' inside the plsql function??


Jie LIANG

St. Bernard Software

10350 Science Center Drive
Suite 100, San Diego, CA 92121
Office:(858)320-4873

jliang@ipinc.com
www.stbernard.com
www.ipinc.com




select statement inside a function: behavior bad

От
Jie Liang
Дата:
I tested select statement inside sql and plpgsql function,
very slow


CREATE FUNCTION geturllike(text) RETURNS SETOF text AS '
SELECT url as url FROM urlinfo WHERE url LIKE $1;
'LANGUAGE 'sql';

CREATE FUNCTION hasdup(text) RETURNS int4 AS '
declare
   v_id         int4;
   rat1         text;
   rat2         text;
   v_url        text;
   rec          record;

begin
     v_url:= $1||''%'';

     for rec in select id,url from urlinfo where url like v_url order by
url loop
        raise notice ''%'',rec.url;
     end loop;
     return 0;
end;
' LANGUAGE 'plpgsql';

Why so slow????
Is it a bug??


Jie LIANG

St. Bernard Software

10350 Science Center Drive
Suite 100, San Diego, CA 92121
Office:(858)320-4873

jliang@ipinc.com
www.stbernard.com
www.ipinc.com



Re: using for rec inside a function: behavior very slow

От
Tom Lane
Дата:
Jie Liang <jliang@ipinc.com> writes:
>      v_url:= $1||''%'';                
>      for rec in select id,url from urlinfo where url like v_url order by
> url loop

[ is slow ]

LIKE index optimization doesn't happen if the LIKE pattern is a variable
when the plan is created.

In 7.1 you can work around this problem by using plpgsql's FOR ... EXECUTE
notation, but I don't think there's any good answer in 7.0.

for rec in execute ''select id,url from urlinfo where url like ''||quote_literal(v_url)||'' order by url'' loop
        regards, tom lane