Процедурні мови PostgreSQL - відмінності між PL / pgSQL та SQL


20

Чи може хто-небудь, будь ласка, узагальнити відмінності між:

http://www.postgresql.org/docs/9.1/static/xfunc-sql.html

і

http://www.postgresql.org/docs/9.1/static/plpgsql.html

?

Основні моменти:

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

1
По-перше, функції SQL (ака. Мова запитів) не включають жодну з процедурних мов PostgreSQL. По-друге, ви вже знайшли найкраще джерело, де можна знайти відповіді на ваші запитання (за винятком останнього - що саме ви маєте на увазі під "політичними питаннями")
dezso

Я попросив узагальнити всі основні питання, не обов’язково використовуючи документацію, яку я вставив, але також використовуючи особисті враження. Ці посилання існують лише для того, щоб усі зрозуміли, про що йдеться.
Gismo Ranas

Не сприймайте це як напад, але як тільки ви прочитаєте ті, ви зможете самі їх підсумувати :) В іншому випадку ваше запитання трохи широке, але, маючи трохи часу, я спробую зібрати кілька думок.
dezso

1
Не нехтуйте іншими процедурними мовами. Зокрема, PL / Perl надзвичайно корисний для областей, де PL / PgSQL занадто обмежений; PL / Pythonu виконує цю роботу, якщо ви віддаєте перевагу Python, але не пропонує модель безпеки на зразок PL / Perl. Також є PL / V8 (JavaScript) як доповнення.
Крейг Рінгер

1
Вітаю, катальдо - я хотів би привітати вас на сайті, оскільки це ваше перше питання тут. Дякуємо за публікацію, і я сподіваюся, що ви будете триматися.
Джек Дуглас

Відповіді:


27

PL / PgSQL і звичайні функції SQL є частиною більшого набору інструментів, і їх слід розглядати в цьому контексті. Я схильний вважати це з точки зору зростаючої шкали потужності, що відповідає рівню зростаючої складності та вартості, де слід використовувати найпростіший інструмент, який буде добре виконувати цю роботу:

  • Використовуйте представлення, де це можливо
  • Якщо представлення не підходить, використовуйте функцію SQL
  • Якщо функція SQL не підходить, використовуйте PL / PgSQL.
  • Якщо PL / PgSQL є занадто обмеженим або недостатньо виразним, використовуйте PL / Perl, PL / Python, PL / V8, PL / Java або будь-яку іншу вашу перевагу
  • ... і там, де жоден спеціаліст не виконає цю роботу, скористайтеся зовнішньою програмою, можливо, LISTENі NOTIFYпоговоріть з нею.

Дуже часто перегляду достатньо, коли ви вважаєте, що потрібна функція. Навіть якщо це надзвичайно дорого для SELECTцілого перегляду, WHEREпункти запиту, що посилаються на перегляд, зазвичай висуваються в поле перегляду і можуть призводити до дуже різних планів запитів. У мене часто спостерігалися значні поліпшення продуктивності від перетворення функцій SQL в представлення.

Основний час, коли ви виявите, що ви не можете використовувати представлення даних, і слід враховувати функцію SQL, коли:

  • Параметри, які не можуть бути виражені простими WHEREпропозиціями, потрібні, як параметр у WITHвиразі
  • Вам потрібно встановити бар'єр безпеки через SECURITY DEFINERфункцію, і security_barrierперегляди в PostgreSQL 9.2 і вище не є достатніми для ваших потреб;
  • Вам потрібні параметри, які оптимізатором не висуваються підпункти перегляду і хочуть керувати ним більш безпосередньо; або
  • Парам багато, або багато повторень парам, тому запитувати запит як перегляд недоцільно.

Для більшості цих завдань звичайна функція SQL працює чудово і її часто читати легше, ніж PL / PgSQL. Функції SQL, оголошені STABLEабо IMMUTABLE(а також не оголошені STRICTабо SECURITY DEFINER), також можуть бути включені в оператор виклику. Це позбавляється від накладних викликів функцій, а також може іноді призвести до величезних переваг від продуктивності, коли умова WHERE у функції виклику оптимізатором підштовхується до функції SQL. Використовуйте функції SQL, коли їх достатньо для виконання завдання.

Основні функції SQL не виконають цю роботу, коли вам потрібно багато логіки. Якщо / then / else операції, які ви не можете виразити як CASEзаяви, багато повторного використання обчислених результатів, нарощування значень з фрагментів, обробка помилок тощо. Виберіть PL / PgSQL, коли ви не можете використовувати функції SQL або вони погано підходять, наприклад:

  • Динамічний SQL та динамічний DDL через EXECUTEоператор
  • Коли ви хочете RAISEпомилки / попередження для журналів або клієнта
  • Коли вам потрібно обробляти винятки - ви можете захоплювати та обробляти помилки EXCEPTIONблоками замість того, щоб вся транзакція закінчувалася помилкою
  • Складна умовна логіка, яка не CASE ... WHENдуже підходить
  • Багато повторного використання обчислених значень, які ви не можете вписати в WITHта CTE
  • Побудова динамічних записів
  • Вам потрібно виконати дію після створення набору результатів

З загальними табличними виразами (CTE), особливо записуються CTE, і WITH RECURSIVEя вважаю, що я використовую PL / PgSQL набагато менше, ніж я звик, тому що SQL настільки більш виразний та потужний. Зараз я набагато більше використовую представлення та прості функції SQL. Варто пам’ятати, що прості функції SQL можуть містити більше одного оператора; останнє твердження - результат функції.


Дуже добре сказано! (додатковий хоч віртуальний +1 для згадування записуваних CTE)
дез

Ці відповіді також пояснюють, чому для деяких функцій потрібна оптимізація .
Eonil

8

plpgsqlце повноцінна процедурна мова зі змінними, циклічними конструкціями тощо. SQLФункція - це просто підзапит. Функція SQL, якщо вона оголошена STABLEабо IMMUTABLEне також оголошена STRICT, часто може бути вбудована в запит виклику, як ніби вона виписана на кожну посилання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.