Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Select ... where ... in () - как перехитрить парсер?  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 12784
Приветствую!
Нужно делать выборку по заданному извне списку идентификаторов.
Эксперименты показывают, что с литералами в in все работает гораздо быстрее по сравнению с закачкой списка во временную таблицу.
Но смущает, что "одноразовые" запросы будут засирать кэш.
Нет ли в Postgres какого-то магического хинта для непомещения запроса в кэш? Поиск не помог.
24 июл 20, 17:56    [22173345]     Ответить | Цитировать Сообщить модератору
 Re: Select ... where ... in () - как перехитрить парсер?  [new]
Павел Лузанов
Member

Откуда:
Сообщений: 722
Соколинский Борис

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

Это не так. Кеш запросов в постгресе возможен только в рамках сессии и только если запросы туда явно поместить (prepare).
24 июл 20, 18:07    [22173353]     Ответить | Цитировать Сообщить модератору
 Re: Select ... where ... in () - как перехитрить парсер?  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8776
1. IMHO
Как-то динамически генерируемы список литералов в in в любом случае выглядит гуано-кодом
Нагрузка на парсер, не возможность сделать PreparedStatement и так далее

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

Ну или через unnest

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

https://www.postgresqltutorial.com/postgresql-array/
24 июл 20, 18:17    [22173355]     Ответить | Цитировать Сообщить модератору
 Re: Select ... where ... in () - как перехитрить парсер?  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4230
Соколинский Борис
Приветствую!
Нужно делать выборку по заданному извне списку идентификаторов.
Эксперименты показывают, что с литералами в in все работает гораздо быстрее по сравнению с закачкой списка во временную таблицу.
Но смущает, что "одноразовые" запросы будут засирать кэш.
Нет ли в Postgres какого-то магического хинта для непомещения запроса в кэш? Поиск не помог.


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

два - никакого кеша запросов в базе нет.
24 июл 20, 18:49    [22173366]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить