(вне базы) прилетает сет айдишников которые надо проверить на наличие в базе
Я могу сделать это одним запросом, который будет делать что-то вроде select * from UNNEST(ARRAY[*прилетевшие ко мне идентификаторы*]) потом заджоиниться на нужную таблицу левым джоином и выдать результат, так я успешно получу какие айдишники из присланного сета в таблице есть, а каких нет
Но исходный сет айдишников может быть "условно" большим (допустим 10к записей) и вместо одного запроса в базу данных можно послать несколько параллельных запросов
Я бы, конечно, послал один большой, но может ли несколько параллельных запросов быть быстрее в таком случае? Извиняюсь за то что очень пространно спрашиваю
10к это не много
Да, поэтому и вопрос скорее теоретический, в плане много ли это в рамках сгенерированого запроса, т е это банально прорва текста
"SELECT id FROM table WHERE id IN (" . join(", ", map { $dbh->quote($_) } @ids) . ")" Пока количество id меньше 10К это будет быстрее чем джойнить. Так народ занимается микрооптимизациями.
а сам планировщик не догадается распаралелить?
сделайте стресс тест, что бы определить границы коллекции и дальше limit
Конечно догадается, но тут глупый вопрос будет ли сильно хуже вариант с несколькими параллельными запросами
Выглядит круто, спасибо!
Стратегии тут по существу две: либо использовать индекс, либо нет (делать последовательный поиск и проверять ID-шник на присутствие в заданном множестве). JOIN с использованием nested loop - это разновидность первой стратегии. А вот HASH JOIN - второй. IN clause может как использовать index merge, так и последовательный поиск. Что выгоднее зависит от размеров таблички и множества ID-шиков. А также размера записи (соотношение размера таблички и индекса). Последовательный поиск постгрес ещё умеет параллелить...
Обсуждают сегодня