Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Select ... where ... in () - как перехитрить парсер? / 4 сообщений из 4, страница 1 из 1
24.07.2020, 17:56
    #39983765
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select ... where ... in () - как перехитрить парсер?
Приветствую!
Нужно делать выборку по заданному извне списку идентификаторов.
Эксперименты показывают, что с литералами в in все работает гораздо быстрее по сравнению с закачкой списка во временную таблицу.
Но смущает, что "одноразовые" запросы будут засирать кэш.
Нет ли в Postgres какого-то магического хинта для непомещения запроса в кэш? Поиск не помог.
...
Рейтинг: 0 / 0
24.07.2020, 18:07
    #39983769
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select ... where ... in () - как перехитрить парсер?
Соколинский Борис

Но смущает, что "одноразовые" запросы будут засирать кэш.

Это не так. Кеш запросов в постгресе возможен только в рамках сессии и только если запросы туда явно поместить ( prepare ).
...
Рейтинг: 0 / 0
24.07.2020, 18:17
    #39983770
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select ... where ... in () - как перехитрить парсер?
1. IMHO
Как-то динамически генерируемы список литералов в in в любом случае выглядит гуано-кодом
Нагрузка на парсер, не возможность сделать PreparedStatement и так далее

2. Вроде, оператор ANY позволяет указывает внутри себя не subquery, а и просто Array. Возможно с IN это так же может получится. Т.ч. вместо списка литералов, наверное можно использовать:
SELECT..... WHERE field = ANY( ? )
где ? просто array который биндится с клиента

Ну или через unnest

Точно не знаю, не проверял, но лично я бы попытался в эту сторону покопать

https://www.postgresqltutorial.com/postgresql-array/
...
Рейтинг: 0 / 0
24.07.2020, 18:49
    #39983778
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Select ... where ... in () - как перехитрить парсер?
Соколинский Борис
Приветствую!
Нужно делать выборку по заданному извне списку идентификаторов.
Эксперименты показывают, что с литералами в in все работает гораздо быстрее по сравнению с закачкой списка во временную таблицу.
Но смущает, что "одноразовые" запросы будут засирать кэш.
Нет ли в Postgres какого-то магического хинта для непомещения запроса в кэш? Поиск не помог.


я бы начал с показа планов запросов с
"Эксперименты показывают, что с литералами в in все работает гораздо быстрее по сравнению с закачкой списка во временную таблицу."
причем с explain (analyze, costs, buffers, timing)

два - никакого кеша запросов в базе нет.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Select ... where ... in () - как перехитрить парсер? / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]