Czy ktoś może streścić różnice między:
http://www.postgresql.org/docs/9.1/static/xfunc-sql.html
i
http://www.postgresql.org/docs/9.1/static/plpgsql.html
?
Główne punkty:
- różnice koncepcyjne
- biorąc pod uwagę problem rodziny, wygoda użytkowania
- kwestie polityczne
postgresql
stored-procedures
plpgsql
Gismo Ranas
źródło
źródło
Odpowiedzi:
Funkcje PL / PgSQL i zwykły SQL są częścią większego zestawu narzędzi i powinny być przeglądane w tym kontekście. Zwykle myślę o tym w kategoriach rosnącej siły połączonej z rosnącą złożonością i kosztami, w której powinieneś użyć najprostszego narzędzia, które dobrze wykona zadanie:
LISTEN
iNOTIFY
porozmawiać z nim.Bardzo często widok jest wystarczający, jeśli uważasz, że potrzebna jest funkcja. Nawet jeśli jest to bardzo kosztowne dla
SELECT
całego widoku,WHERE
klauzule w zapytaniu odnoszące się do widoku są zwykle spychane do widoku i mogą powodować bardzo różne plany zapytań. Często miałem duże ulepszenia wydajności od konwersji funkcji SQL na widoki.Główny czas, w którym okazuje się, że nie możesz użyć widoku i powinieneś rozważyć funkcję SQL, to:
WHERE
Potrzebne są parametry, których nie można wyrazić jako proste klauzule, podobnie jak parametr wWITH
wyrażeniuSECURITY DEFINER
funkcji, asecurity_barrier
widoki w PostgreSQL 9.2 i nowszych nie są wystarczające dla twoich potrzeb;W przypadku większości tych zadań zwykła funkcja SQL działa dobrze i często jest łatwiejsza do odczytania niż PL / PgSQL. Funkcje SQL zadeklarowane
STABLE
lubIMMUTABLE
(i nie zadeklarowaneSTRICT
lubSECURITY DEFINER
) można również wstawić do instrukcji wywołującej. Pozbywa się to narzutu wywołania funkcji, a czasem może również przynieść ogromne korzyści w zakresie wydajności, gdy warunek WHERE w funkcji wywołującej zostaje zepchnięty do funkcji SQL przez optymalizator. Korzystaj z funkcji SQL, gdy są one wystarczające do wykonania zadania.Głównymi czasami, gdy funkcje SQL nie wykonają zadania, jest potrzeba dużej logiki. Jeśli operacje / then / else, których nie można wyrazić jako
CASE
instrukcje, przydaje się wiele ponownego wykorzystania obliczonych wyników, budowanie wartości z porcji, obsługa błędów itp. PL / PgSQL. Wybierz PL / PgSQL, gdy nie możesz korzystać z funkcji SQL lub są one słabo dopasowane, na przykład:EXECUTE
instrukcjiRAISE
błędy / ostrzeżenia dla dzienników lub klientaEXCEPTION
bloków zamiast zamykać całą transakcję na błądCASE ... WHEN
zbyt dobrzeWITH
i CTEW przypadku typowych wyrażeń tabelowych (CTE), szczególnie zapisywalnych CTE
WITH RECURSIVE
, okazuje się, że używam PL / PgSQL o wiele mniej niż kiedyś, ponieważ SQL jest o wiele bardziej ekspresyjny i potężny. Korzystam teraz z widoków i zwykłych funkcji SQL. Warto pamiętać, że zwykłe funkcje SQL mogą zawierać więcej niż jedną instrukcję; ostatnia instrukcja jest wynikiem funkcji.źródło
plpgsql
jest pełnoprawnym językiem proceduralnym, ze zmiennymi, zapętlonymi konstrukcjami itp.SQL
Funkcja jest po prostu podzapytaniem. Funkcja SQL, jeśli jest zadeklarowanaSTABLE
lubIMMUTABLE
nie jest również zadeklarowanaSTRICT
, często może zostać wstawiona do zapytania wywołującego, tak jakby była zapisana przy każdym odwołaniu.źródło