Nano Hash - криптовалюты, майнинг, программирование

Разница между языком sql и языком plpgsql в функциях PostgreSQL

Я очень новичок в разработке баз данных, поэтому у меня есть некоторые сомнения относительно моего следующего примера:

Функция f1 () - язык sql

 create or replace function f1(istr  varchar)
 returns text as $$ 
 select 'hello! '::varchar || istr;
 $$ language sql;

Функция f2 () - язык plpgsql

 create  or replace function f2(istr  varchar)
 returns text as $$ 
 begin select 'hello! '::varchar || istr; end;
 $$ language plpgsql;
  • Обе функции могут вызываться как select f1('world') или select f2('world').

  • Если я вызываю select f1('world'), вывод будет:

     `hello! world`
    
  • # P6 #
    # P7 #
  • Я хочу знать разницу и в каких ситуациях мне следует использовать language sql или language plpgsql.

Будем очень признательны за любую полезную ссылку или ответы относительно функций.



Ответы:


1

Функции SQL

... лучший выбор:

  • Для простых скалярных запросов. Планировать особо нечего, лучше сэкономьте на накладных расходах.

  • Для единичных (или очень немногих) вызовов за сеанс. Ничего не выиграет от кэширования планов с помощью подготовленных операторов PL / pgSQL. См. ниже.

  • Если они обычно вызываются в контексте более крупных запросов и достаточно просты, чтобы быть встроенными .

  • Из-за отсутствия опыта работы с каким-либо процедурным языком, например PL / pgSQL. Многие хорошо знают SQL, и это все, что вам нужно для SQL-функций. Мало кто может сказать то же самое о PL / pgSQL. (Хотя это довольно просто.)

  • Чуть короче код. Нет накладных расходов на блок.

Функции PL / pgSQL

... лучший выбор:

  • Очевидно, когда вам нужны какие-либо процедурные элементы или переменные, которые недоступны в функциях SQL.

  • Для любого типа динамического SQL, где вы создаете и _ 1_ динамически. Необходимо соблюдать особую осторожность, чтобы избежать SQL-инъекций. Подробнее:

  • Когда у вас есть вычисления, которые можно повторно использовать в нескольких местах, а CTE нельзя растянуть для этой цели. В функции SQL у вас нет переменных, и вам придется многократно вычислять или записывать данные в таблицу. В этом связанном ответе на dba.SE есть параллельные примеры кода для решения той же проблемы с использованием функции SQL / функции plpgsql / запроса с CTE:

Задания несколько дороже, чем на других процедурных языках. Адаптируйте стиль программирования, не использующий больше назначений, чем необходимо.

  • Когда функция не может быть встроена и вызывается повторно. В отличие от функций SQL, планы запросов могут быть кешируется для всех операторов SQL внутри функций PL / pgSQL; они рассматриваются как подготовленные операторы, план кэшируется для повторных вызовов в рамках одного и того же сеанса (если Postgres ожидает, что кешированный (общий) план будет работать лучше, чем каждый раз перепланирование. Вот почему PL В таких случаях функции / pgSQL обычно быстрее после первой пары вызовов.

    Вот ветка на pgsql-performance, в которой обсуждаются некоторые из этих вопросов:

  • Когда вам нужно перехватить ошибки < / strong>.

  • Для функций триггера.

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

Также учтите:


Чтобы на самом деле вернуться из функции PL / pgSQL, вы можете написать:

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

Есть и другие способы:

16.07.2014
  • Хорошо сказано; Я тоже забыл упомянуть динамический SQL. 16.07.2014
  • Спасибо. Думаю, есть одно отличие, о котором не упоминалось в вашем ответе. Верно ли, что функция SQL не может содержать никаких команд, которые изменяют системный каталог, например CREATE TABLE, в то время как функция PL / pgSQL может? Какова причина? См. stackoverflow.com/questions/51004980/ 25.06.2018
  • @ Бен: Не совсем так. Функции SQL могут содержать команды DDL. Вам просто нужно знать о последствиях. И некоторые комбинации команд не работают. Я добавил ответ там. 26.06.2018

  • 2

    PL / PgSQL - это процедурный язык для PostgreSQL, основанный на SQL. В нем есть циклы, переменные, обработка ошибок / исключений и т. Д. Не весь SQL является допустимым PL / PgSQL - например, как вы обнаружили, вы не можете использовать SELECT без INTO или RETURN QUERY. PL / PgSQL также может использоваться в DO блоках для одноразовых процедур.

    sql функции могут использовать только чистый SQL, но часто они более эффективны, и они ' его проще писать, потому что вам не нужен блок BEGIN ... END; и т. д. Функции SQL могут быть встроенными, что неверно для PL / PgSQL.

    Люди часто используют PL / PgSQL там, где достаточно простого SQL, потому что они привыкли мыслить процедурно. В большинстве случаев, когда вы думаете, что вам нужен PL / PgSQL, на самом деле это не так. Рекурсивные CTE, боковые запросы и т. Д. Обычно удовлетворяют большинству потребностей.

    Для получения дополнительной информации ... см. Руководство.

    15.07.2014
  • Верно, что решения, основанные на наборах, обычно лучше. Но это еще не окончательный вердикт о том, использовать ли функцию SQL или PL / pgSQL. Новички иногда используют plpgsql по неправильным причинам. 16.07.2014

  • 3

    просто сделайте запрос выбора, который вы написали внутри функции, как возвращаемое значение:

     create  or replace function f2(istr  varchar)
     returns text as $$ 
     begin return(select 'hello! '::varchar || istr); end;
     $$ language plpgsql;
    
    14.11.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..


    © 2024 nano-hash.ru, Nano Hash - криптовалюты, майнинг, программирование