@Leo_Eldorado

Почему запрос с IN в СУБД PostgreSQL выполняется значительно медленнее аналогичного запроса с OR?

Здравствуйте!
Имеется следующий запрос:
SELECT * from table 
WHERE column IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17) 
ORDER BY ID DESC LIMIT 500 OFFSET 0

Он выполняется на достаточно большой таблице размером в 25 млн. записей и время его выполнения составляет примерно 5-7 минут. Но стоит заменить IN на OR как время выполнения падает до 1 секунды. Вопрос состоит в следующем: почему так происходит и следует ли использовать данный метод для оптимизации запроса? В explain видно, что планы запросов разные и в одной статье видел совет наоборот переписывать OR на IN, поэтому и сомневаюсь, что OR будет лучшим выбором. Тем более, для ускорения этого запроса пробовал и другой подход, который заключается в создании отдельной, специализированной таблицы, к которой сначала выполняю подзапрос, после чего делаю объединение результатов этого запроса с основной таблицей с помощью INNER JOIN. Данный подход тоже дает хорошие результаты, ускоряя получение данных до 1 секунды.
  • Вопрос задан
  • 310 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
ORDER BY ID

хм.

Покажите explain (analyze,buffers) запросов. И покажите планы запросов с "ORDER BY ID + 0". И ещё
select * from pg_stats where tablename = 'table' and attname = 'column'


Я предположу что у вас вовсе не in медленный, а or ломает оценку планировщика, но в этом конкретном случае это оказывается неожиданным благом.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы