PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Różnica między językiem sql a językiem plpgsql w funkcjach PostgreSQL

Funkcje SQL

... są lepszym wyborem:

  • W przypadku prostych zapytań skalarnych . Niewiele do planowania, lepiej oszczędzaj na kosztach.

  • W przypadku pojedynczych (lub bardzo niewielu) połączeń na sesję . Nic do zyskania z buforowania planu za pomocą przygotowanych instrukcji, które PL/pgSQL ma do zaoferowania. Zobacz poniżej.

  • Jeśli są zwykle wywoływane w kontekście większych zapytań i są na tyle proste, aby były wbudowane .

  • Z braku doświadczenia z dowolnym językiem proceduralnym, takim jak PL/pgSQL. Wielu dobrze zna SQL i to wszystko, czego potrzebujesz do funkcji SQL. Niewielu może powiedzieć to samo o PL/pgSQL. (Chociaż to dość proste.)

  • Nieco krótszy kod. Brak narzutu blokowego.

Funkcje PL/pgSQL

... są lepszym wyborem:

  • Gdy potrzebujesz jakichkolwiek elementów proceduralnych lub zmienne które oczywiście nie są dostępne w funkcjach SQL.

  • Dla każdego rodzaju dynamicznego SQL , gdzie budujesz i EXECUTE wypowiedzi dynamicznie. Należy zachować szczególną ostrożność, aby uniknąć wstrzyknięcia SQL. Więcej szczegółów:

    • Funkcje Postgres a przygotowane zapytania
  • Gdy masz obliczenia które można ponownie wykorzystać w kilku miejscach i CTE nie może być w tym celu rozciągnięte. W funkcji SQL nie masz zmiennych i musiałbyś wielokrotnie wykonywać obliczenia lub zapisywać do tabeli. Ta powiązana odpowiedź na dba.SE zawiera obok siebie przykłady kodu do rozwiązania tego samego problemu za pomocą funkcji SQL / funkcji plpgsql / zapytania z CTE:

    • Jak przekazać parametr do funkcji

Zadania są nieco droższe niż w innych językach proceduralnych. Dostosuj styl programowania, który nie używa więcej przypisań niż to konieczne.

  • Gdy funkcja nie może być wbudowana i jest wywoływana wielokrotnie. W przeciwieństwie do funkcji SQL, plany zapytań mogą być buforowane dla wszystkich instrukcji SQL wewnątrz funkcji PL/pgSQL; są traktowane jak przygotowane zestawienia , plan jest buforowany dla powtarzających się wywołań w ramach tej samej sesji (jeśli Postgres oczekuje, że buforowany (ogólny) plan będzie działał lepiej niż ponowne planowanie za każdym razem. To jest powód, dla którego funkcje PL/pgSQL są zwykle szybsze po kilku pierwszych połączeniach w takich przypadkach.

    Oto wątek na temat wydajności pgsql omawiający niektóre z tych elementów:

    • Odp.:funkcje pl/pgsql przewyższają funkcje sql?
  • Kiedy trzeba wyłapać błędy .

  • Dla funkcji wyzwalania .

  • W przypadku dołączania instrukcji DDL zmienianie obiektów lub zmienianie katalogów systemowych w jakikolwiek sposób związany z kolejnymi poleceniami - ponieważ wszystkie instrukcje w funkcjach SQL są analizowane jednocześnie, podczas gdy funkcje PL/pgSQL planują i wykonują każdą instrukcję sekwencyjnie (jak przygotowana instrukcja). Zobacz:

    • Dlaczego funkcje PL/pgSQL mogą mieć efekt uboczny, a funkcje SQL nie?

Weź również pod uwagę:

  • Wydajność procedur zapisanych w PostgreSQL

Aby faktycznie zwrócić z funkcji PL/pgSQL, możesz napisać:

CREATE FUNCTION f2(istr varchar)
  RETURNS text AS
$func$
BEGIN
   RETURN 'hello! ';  -- defaults to type text anyway
END
$func$ LANGUAGE plpgsql;

Są inne sposoby:

  • Czy mogę sprawić, by funkcja plpgsql zwróciła liczbę całkowitą bez użycia zmiennej?
  • Podręcznik „Powrót z funkcji”


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Koncepcje Oracle High Availability w PostgreSQL

  2. Postgres:BŁĄD:plan w pamięci podręcznej nie może zmieniać typu wyniku

  3. Jaki jest właściwy indeks do odpytywania struktur w tablicach w jsonb Postgresa?

  4. Zrozumienie kolumn systemowych w PostgreSQL

  5. hasMany wywołało coś, co nie jest instancją Sequelize.Model