Как я могу эффективно выбрать самую последнюю запись из зависимой таблицы

#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);