postgres - ile razy wykona =?ISO-8859-2?Q?si=EA_funkcja_w_?==?ISO-8859-2?Q?zapytaniu?=
Mac - 13-02-2006 10:32
postgres - ile razy wykona =?ISO-8859-2?Q?si=EA_funkcja_w_?==?ISO-8859-2?Q?zapytaniu?=
Witam,
Mam pytanie dotyczące postgresql. Napisałem funkcję w C i podłączyłem do Postgresa za pomocą CREATE FUNCTION - nazwijmy tą funkcję X(text), która zwraca integer. Czy w zapytaniu np.:
SELECT name, X(name) FROM tabela WHERE X(name) > 50;
funkcja X() zostanie obliczona raz czy dwa razy?
Jeśli będzie obliczana dwa razy, to w jaki sposób można sprawić, żeby była obliczana tylko raz? Funkcja jest dosyć czasochłonna, a zależy mi na tym, żeby całość działała jak najszybciej.
Pozdrawiam
Maciej
Marek Malczewski - 13-02-2006 10:32
Mac wrote:
> Witam, > > Mam pytanie dotyczące postgresql. Napisałem funkcję w C i podłączyłem do > Postgresa za pomocą CREATE FUNCTION - nazwijmy tą funkcję X(text), która > zwraca integer. Czy w zapytaniu np.: > > SELECT name, X(name) FROM tabela WHERE X(name) > 50; > > funkcja X() zostanie obliczona raz czy dwa razy? > > Jeśli będzie obliczana dwa razy, to w jaki sposób można sprawić, żeby > była obliczana tylko raz? Funkcja jest dosyć czasochłonna, a zależy mi > na tym, żeby całość działała jak najszybciej. > > Pozdrawiam > > Maciej
Wszystko wskazuje na to ze zostanie wykonana dwukrotnie dla kazdego zwracanego rekordu. Podzapytanie tez zdaje sie nie ratowac sytuacji. Latwo to sprawdzic piszac sobie procedurke, ktora otrzymuje takie same parametry i przy kazdym uruchomieniu zapisuje cos do jakiejs tabeli.
Pokombinuj z tabelami tymczasowymi.
Andrzej Stróżyński - 13-02-2006 10:32
Użytkownik "Marek Malczewski" <marek_malczewski_WYTNIJ_TO_@wp.pl> napisał w wiadomości news:dso410$9fh$1@kujawiak.man.lodz.pl... > Mac wrote: > >> Witam, >> >> Mam pytanie dotyczące postgresql. Napisałem funkcję w C i podłączyłem do >> Postgresa za pomocą CREATE FUNCTION - nazwijmy tą funkcję X(text), która >> zwraca integer. Czy w zapytaniu np.: >> >> SELECT name, X(name) FROM tabela WHERE X(name) > 50; >> >> funkcja X() zostanie obliczona raz czy dwa razy? >> >> Jeśli będzie obliczana dwa razy, to w jaki sposób można sprawić, żeby >> była obliczana tylko raz? Funkcja jest dosyć czasochłonna, a zależy mi >> na tym, żeby całość działała jak najszybciej. >> >> Pozdrawiam >> >> Maciej > > Wszystko wskazuje na to ze zostanie wykonana dwukrotnie dla kazdego > zwracanego rekordu. Podzapytanie tez zdaje sie nie ratowac sytuacji. Latwo > to sprawdzic piszac sobie procedurke, ktora otrzymuje takie same parametry > i przy kazdym uruchomieniu zapisuje cos do jakiejs tabeli. > > Pokombinuj z tabelami tymczasowymi.
spróbuj tak: SELECT * FROM ( SELECT name, X(name) AS x_name FROM tabela ) as sub WHERE x_name > 50;
A.S.
Mac - 13-02-2006 10:32
>>> >>>SELECT name, X(name) FROM tabela WHERE X(name) > 50;
> > spróbuj tak: > SELECT * FROM ( > SELECT name, X(name) AS x_name FROM tabela > ) as sub > WHERE x_name > 50; >
Dzięki, faktycznie działa. O coś takiego właśnie mi chodziło.
Napisałem testową funkcję, która czeka 5 sekund. Dla pierwszego przypadku (mojego) wykonuje się nieco ponad 10 sek, dla Twojego natomiast 5 sek.
Pozdrawiam
Maciej
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 13-02-2006 10:32
Mac wrote: > Witam, > > Mam pytanie dotyczące postgresql. Napisałem funkcję w C i podłączyłem do > Postgresa za pomocą CREATE FUNCTION - nazwijmy tą funkcję X(text), która > zwraca integer. Czy w zapytaniu np.: > > SELECT name, X(name) FROM tabela WHERE X(name) > 50; > > funkcja X() zostanie obliczona raz czy dwa razy? > > Jeśli będzie obliczana dwa razy, to w jaki sposób można sprawić, żeby > była obliczana tylko raz? Funkcja jest dosyć czasochłonna, a zależy mi > na tym, żeby całość działała jak najszybciej.
Zadeklaruj ją STABLE albo IMMUTABLE, w zależności od tego jakie warunki spełnia. Z tego co piszesz wynika, że nie jest VOLATILE, a ta wartość jest domyślnie przyjmowana. Dzięki tem pozwolisz postgresowi zoptymalizować wywołania funkcji.
-- P.M.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
postgresql - int/int
postgresql Select count(*) czy raczej Select count(ID)
mecze sie i mecze i nic - zapytanie czesciowe
[sql][pgsql] zapytanie sql
Postgres - replikcja master-master
Dopasowanie do "najlepszego" dopasowania :) [ PostgreSQL]
[mysql 4.0] SELECT t1.id, t1.foo FROM t1 oraz COUNT t2 w jednym zapytaniu.
[MySQL] Zapytanie z pliku , wynik do pliku
pytanie o zapytanie z having count = count z innej kolumny
Jedno zapytanie różne wyniki w polu data [mysql i mysql+php]
zanotowane.pldoc.pisz.plpdf.pisz.plred-hacjenda.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|