Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
26.01.2020, 21:31
|
|||
---|---|---|---|
|
|||
Кэширование результатов функции |
|||
#18+
Здравствуйте! У функции (пусть будет fnc) на входе есть 2 параметра. Результат функции используется в запросе в нескольких местах. Запрос следующего вида Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
уникальных пар idUser, dPeriodFrom от общего числа строк обычно менее 1%. Суть вопроса в следующем: как можно организовать кэширование результатов функции? Что бы она вызвалась не 2000 раз, а только 20. сейчас сделано следующим образом сделана обертка над функций Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
В целом выигрыш по скорости есть, но уж слишком большие накладные расходы на создание временной таблицы и как я понял на открытие новой транзакции во внутреннем Begin - End. Каким еще образом можно увеличить быстродействие? по таймингами сканирование таблицы tblResult занимает примерно 6 сек, возвращает 1300 строк с 12 уникальными парами idUser, dPeriod1. 1300 вызовов функции fnc - 4-6 сек. 1300 вызовов функции fnc_cache - 2-3 сек. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
26.01.2020, 23:30
|
|||
---|---|---|---|
|
|||
Кэширование результатов функции |
|||
#18+
Swa111, Если вы знаете как сделать сразу результат всех уникальных строк для fnc_cache, то можно сделать mat. view для запроса, который этот результат возвращает и обновлять view по крону через интервал или еще как-нибудь. вот вам и кэш, плюс к матвью еще индексы повесить можно если значений много. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
27.01.2020, 00:43
|
|||
---|---|---|---|
Кэширование результатов функции |
|||
#18+
Для начала проверить что функция объявлена как stable. Если вы хотите её кэшировать - вероятно по логике она stable, а не volatile. Проверьте что вы сообщили об этом планировщику. Затем посмотреть на функцию. Возможно переписать на language sql (с учётом прочих ограничений) для включения function inline ... |
|||
:
Нравится:
Не нравится:
|
|||
|
27.01.2020, 06:56
|
|||
---|---|---|---|
|
|||
Кэширование результатов функции |
|||
#18+
Troglodit, В принципе вариантов конечное множество, но не хотелось бы делать лишних расчетов которые и не пригодятся в текущем периоде. Melkij, Stable не помогло. Либо нужно как то по другому запрос записать. в таком виде она все равно вызывается для каждой строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
27.01.2020, 08:18
|
|||
---|---|---|---|
|
|||
Кэширование результатов функции |
|||
#18+
Swa111 Troglodit, В принципе вариантов конечное множество, но не хотелось бы делать лишних расчетов которые и не пригодятся в текущем периоде. Melkij, Stable не помогло. Либо нужно как то по другому запрос записать. в таком виде она все равно вызывается для каждой строки. Вот как то так эта задача решается без лишнего мозголомства: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Как раз то что вы хотите получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
27.01.2020, 12:00
|
|||
---|---|---|---|
|
|||
Кэширование результатов функции |
|||
#18+
Maxim Boguk, если я правильно понял, то автору нужны посчитанные результаты не на один запрос. В вашем примере, при повторном запуске функция опять пересчитает данные, если я не ошибаюсь. Автору нужен кэш. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
27.01.2020, 12:20
|
|||
---|---|---|---|
|
|||
Кэширование результатов функции |
|||
#18+
Maxim Boguk, благодарю, такой вариант тоже использовал, но по каким то причинам время выполнения запроса стало даже больше чем с вызовом функций для каждой строки. Хотя количество вызовов самой функции сократилось. Вчера пока описывал задачу, понял где функция кеша тормозила. Основная проблема была во внутренней транзакции. Вынес создание таблицы с расчитанными значениями в отдельную функцию. В итоге в таком варианте ручного кэша заработало как хотелось. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
27.01.2020, 12:32
|
|||
---|---|---|---|
Кэширование результатов функции |
|||
#18+
Troglodit Maxim Boguk, если я правильно понял, то автору нужны посчитанные результаты не на один запрос. В вашем примере, при повторном запуске функция опять пересчитает данные, если я не ошибаюсь. Автору нужен кэш. аффтару не нужен кеш. аффтару может быть надо принудить запрос к хеш-джойну от (?дистинктной) таблицы(материализованного CTE) рез-тов, вместо предположительного нестед-лупа с многократным пересчетом предположительно дорогой ф-ии. до тех пор, пока вместо планов запроса он размахивает домыслами -- точнее сказать нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
27.01.2020, 14:02
|
|||
---|---|---|---|
|
|||
Кэширование результатов функции |
|||
#18+
qwwq аффтару не нужен кеш. аффтару может быть надо принудить запрос к хеш-джойну от (?дистинктной) таблицы(материализованного CTE) рез-тов, вместо предположительного нестед-лупа с многократным пересчетом предположительно дорогой ф-ии. до тех пор, пока вместо планов запроса он размахивает домыслами -- точнее сказать нельзя. Я исходил из авторкак можно организовать кэширование результатов функции? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
27.01.2020, 14:23
|
|||
---|---|---|---|
|
|||
Кэширование результатов функции |
|||
#18+
Swa111 Maxim Boguk, благодарю, такой вариант тоже использовал, но по каким то причинам время выполнения запроса стало даже больше чем с вызовом функций для каждой строки. Хотя количество вызовов самой функции сократилось. Тогда надо на explain analyze смотреть. Может вы чего то недосмотрели. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
27.01.2020, 19:39
|
|||
---|---|---|---|
|
|||
Кэширование результатов функции |
|||
#18+
Maxim Boguk, Еще раз благодарю за внимание, сегодня узнал как можно посмотреть план выполнения запроса , который находится внутри функции. Нашел место из за которого медленно работал и запрос переписал как Вы предложили + недостающие индексы. Пересмотрели логику функции и оказалось что ее можно привести к одному запросу используя преимущества plpgsql (раньше требовалась совместимость с ораклом). ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=53&mobile=1&tid=1994847]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 141ms |
0 / 0 |