Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
13.02.2019, 15:27
|
|||
---|---|---|---|
Многократный вызов иммутабельной функции |
|||
#18+
Есть некая иммутабельная функция: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
При её вызове база кидает нотайс: NOTICE: text-search query doesn't contain lexemes: "" Выполним вот такой запрос: Код: sql 1. 2.
Две строки, но нотайс — поскольку функция иммутабельная, она вызвалась один раз. Теперь вызовем этот же запрос, обёрнутый в другую функцию: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Выполняем: Код: sql 1.
Один нотайс. А дальше начинаются странности: если мы делаем функцию-обёртку не STABLE или IMMUTABLE, а VOLATILE, иммутабельная функция изнутри неё вызывается дважды (что можно видеть по двум нотайсам), то есть по разу для каждой строчке. Почему? Функции-обёртке не всё равно? Она-то в любом случае вызывается один раз. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
То же самое наблюдается, если мы задаём функции-обёртке опцию выполнения с привилегиями создателя (SECURITY DEFINER): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Почему такое странное поведение? Можно ли это преодолеть (хотя бы для случая SECURITY DEFINER)? PostgreSQL 10.6 ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.02.2019, 18:11
|
|||
---|---|---|---|
Многократный вызов иммутабельной функции |
|||
#18+
torbasowТеперь вызовем этот же запрос, обёрнутый в другую функцию: Посмотрите на его explain и увидите, что планировщик вовсе выкинул функцию datamart.function и делал только голый запрос. Другие два варианта sql inline нельзя. В остальном поведение допустимое, immutable не гарантирует, что будет вызван единожды. immutable утверждает, что такое может быть на усмотрение базы. Почему внутри функции поведение отличается - у меня готового ответа нет. Может быть не сделали. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.02.2019, 09:13
|
|||
---|---|---|---|
|
|||
Многократный вызов иммутабельной функции |
|||
#18+
Если обертку переписать на plgslq, и в обертке использовать динамический SQL, то проблем таких не возникает. Встает вопрос о целесообразности использовать sql функции, т.к. их поведение в не которых случаях непредсказуемо. В своей практике я с этим сталкиваюсь уже не первый раз. Или как-то надо четко понимать, если логику можно реализовать как на sql-функциях, так и на plsql-функциях, как сделать правильный выбор, с точки зрения производительности. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=53&mobile=1&tid=1995344]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
2ms |
others: | 276ms |
total: | 422ms |
0 / 0 |