Лучший метод для получения записей по большой коллекции идентификаторов - PullRequest
0 голосов
/ 01 марта 2020

Я пишу запрос с кодом, чтобы выбрать все записи из таблицы, в которой значение столбца содержится в CSV. Я обнаружил предположение, что лучший способ сделать это - использовать функцию ARRAY в PostgresQL.

. У меня есть таблица price_mapping, и у нее есть первичный ключ id и столбец customer_id введите bigint.

Я хочу вернуть все записи с идентификатором клиента в массиве, который я сгенерирую из csv.

Я пробовал это:

select * from price_mapping
where ARRAY[customer_id] <@ ARRAY[5,7,10]::bigint[]

(5,7,10 часть на самом деле будет CSV, вставленная моим приложением)

Но я не уверен, что это правильно. В приложении массив может содержать 10 тысяч идентификаторов, поэтому я хочу убедиться, что я делаю все правильно, используя метод наилучшей производительности.

Это правильный путь в PostgreSQL для извлечения большой коллекции записей по предопределенным значение столбца?

Спасибо

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Если ваши данные достаточно велики, попробуйте следующее:

  • Считайте CSV, используя FDW ( упаковщик внешних данных )
  • Если вам нужно это соединение часто из него можно создать материализованное представление, содержащее только необходимые столбцы. Refre sh это при создании нового CSV.
  • Присоединитесь к вашему столу против этого чужого стола или материализованного вида.
1 голос
/ 01 марта 2020

Обычно это делается с помощью SQL стандартного in оператора .

select *
from price_mapping
where customer_id in (5,7,10)

Я не вижу причин, по которым ARRAY будет быстрее. Это может быть медленнее, если учесть, что он должен строить массивы , хотя он мог бы быть оптимизирован.

В прошлом это было более оптимальным:

select *
from price_mapping
where customer_id = ANY(VALUES (5), (7), (10)

Но новые i sh версии Postgres должны оптимизировать это для вас.

Передача десятков тысяч идентификаторов может столкнуться с ограничением размера запроса в Postgres или в драйвере базы данных, так что вы можете sh для пакетирования нескольких тысяч за один раз.


Что касается наилучшей производительности, ответ состоит в том, чтобы не искать десятки тысяч идентификаторов. Найдите что-то , которое связывает их вместе, индексируйте этот столбец и ищите по нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...