#sql #postgresql
#sql #postgresql
Вопрос:
Вот что я делаю, это работает, но мучительно медленно. Мне нужно ее оптимизировать.
SELECT main_table.id
FROM main_table
INNER JOIN linked_table latest_linked_record ON latest_linked_record.id = (
SELECT clever_alias.id
FROM linked_table clever_alias
WHERE clever_alias.claim_order_id = main_table.id
ORDER BY clever_alias.updated_at DESC,
clever_alias.id DESC
LIMIT 1
)
WHERE latest_linked_record.some_column NOT IN (1, 19)
Кажется, я боролся с этим всю свою жизнь, используя MySQL, MSSQL, Oracle и Postgres одинаково. Помимо стратегий, таких как материализованные представления, могу ли я что-нибудь сделать для повышения производительности?
Комментарии:
1. Возможно, используя
LATERAL JOIN
2. есть несколько более быстрых способов. самое быстрое решение зависит от нераскрытых деталей вашей настройки. версия postgres, определения таблиц, соответствующие индексы, распределение данных.
Ответ №1:
В Postgres я бы рекомендовал DISTINCT ON
:
SELECT mt.id
FROM main_table mt INNER JOIN
(SELECT DISTINCT ON (lt.claim_order_id) lt.*
FROM linked_table lt
ORDER BY lt.claim_order_id, lt.claim_order_id DESC, lt.id DESC
) lt
ON lt.claim_order_id = mt.id
WHERE lt.some_column NOT IN (1, 19);
Конечно, для этого запроса JOIN
не требуется:
SELECT lt.claim_order_id
FROM (SELECT DISTINCT ON (lt.claim_order_id) lt.*
FROM linked_table lt
ORDER BY lt.claim_order_id, lt.claim_order_id DESC, lt.id DESC
) lt
WHERE lt.some_column NOT IN (1, 19);