(SELECT date
FROM registrations
WHERE registrations.document_id = documents.id order by date desc NULLS LAST LIMIT 1) AS register_date
FROM documents) AS document_data — тут должна быть view, упростил для понимания
ORDER BY register_date desc NULLS LAST LIMIT 100
Нужно отсортировать документы по самой актуальной из связанных дат.
Проблема в том, что при таком запросе идет seq скан по таблице и сортировка по всей таблице. Соответственно запрос неприемлимо долго идет (в бд registrations 13 миллионов записей, в documents 11 миллионов). Индексы не тянутся при таком подзапросе (как и при агрегатной max). Пробовал играться с джоинами, но без агрегатной функции самую новую дату не вытащить и т.д.
Никто не сталкивался? Мб есть какие варианты, кроме материализации таблицы с датами =\
По-любому дело в ORDER BY date DESC NULLS LAST Такой индекс пробовали добавить?
Можно сюда залить explain analyze https://explain.depesz.com
Обсуждают сегодня