PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Разлика между език sql и език plpgsql във функциите на PostgreSQL

SQL функции

... са по-добрият избор:

  • Запрости скаларни заявки . Няма много за планиране, по-добре спестете режийни разходи.

  • За единични (или много малко) обаждания на сесия . Няма какво да спечелите от кеширането на планове чрез подготвени оператори, които PL/pgSQL може да предложи. Вижте по-долу.

  • Ако те обикновено се извикват в контекста на по-големи заявки и са достатъчно прости, за да бъдат вградени .

  • Поради липса на опити с всеки процедурен език като PL/pgSQL. Мнозина познават добре SQL и това е всичко, което ви е необходимо за SQL функциите. Малцина могат да кажат същото за PL/pgSQL. (Въпреки че е доста просто.)

  • Малко по-кратък код. Без блокировка.

PL/pgSQL функции

... са по-добрият избор:

  • Когато имате нужда от някакви процедурни елементи или променливи които не са налични в SQL функциите, очевидно.

  • За всякакъв вид динамичен SQL , където изграждате и EXECUTE изявления динамично. Необходими са специални грижи, за да се избегне SQL инжектиране. Повече подробности:

    • Функции на Postgres срещу подготвени заявки
  • Когато имате изчисления които могат да бъдат използвани повторно на няколко места и CTE не може да се разтегне за целта. В SQL функция нямате променливи и ще бъдете принудени да изчислявате многократно или да записвате в таблица. Този свързан отговор на dba.SE има един до друг примери за код за решаване на същия проблем с помощта на SQL функция / функция plpgsql / заявка с CTEs:

    • Как да предам параметър във функция

Заданията са малко по-скъпи, отколкото в други процедурни езици. Адаптирайте стил на програмиране, който не използва повече задания, отколкото е необходимо.

  • Когато функция не може да бъде вградена и се извиква многократно. За разлика от SQL функциите, плановете за заявки могат да се кешират за всички SQL изрази в PL/pgSQL функции; те се третират като изготвени изявления , планът се кешира за повтарящи се повиквания в рамките на една и съща сесия (ако Postgres очаква кешираният (генеричен) план да работи по-добре от повторното планиране всеки път. Това е причината функциите PL/pgSQL да са обикновено по-бързи след първите няколко обаждания в такива случаи.

    Ето нишка за pgsql-performance, в която се обсъждат някои от тези елементи:

    • Re:pl/pgsql функции превъзхождат тези sql?
  • Когато трябва да захващате грешки .

  • Зафункции за задействане .

  • При включване на DDL оператори, променящи обекти или промяна на системни каталози по какъвто и да е начин, свързан с последващи команди - защото всички изрази в SQL функциите се анализират наведнъж, докато функциите PL/pgSQL планират и изпълняват всеки оператор последователно (като подготвен оператор). Вижте:

    • Защо функциите PL/pgSQL могат да имат страничен ефект, докато SQL функциите не могат?

Също така имайте предвид:

  • Ефективност на PostgreSQL съхранената процедура

За действително връщане от PL/pgSQL функция, можете да напишете:

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

Има и други начини:

  • Мога ли да накарам функция plpgsql да връща цяло число, без да използвам променлива?
  • Ръководството за „Връщане от функция“


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изпълнете заявки на PostgreSQL от командния ред

  2. Две SQL LEFT JOINS дават неправилен резултат

  3. Как да конкатенираме колони в Postgres SELECT?

  4. Как да върнете списък с налични съпоставяния в PostgreSQL

  5. Съвети за съхранение на резервни копия на PostgreSQL в Amazon AWS