Есть ли способ явно указать планировщику запросов Postgres, что столбцы являются зависимыми?

У меня есть две таблицы, подобные этой: (Мои реальные таблицы отличаются. Я использую их для упрощения проблемы.)

purchases (
  item_id,
  order_id,
  PRIMARY KEY(item_id, order_id)
)
payments (
  item_id,
  order_id,
  payment_id
)

Когда я запускаю такой запрос, я получаю слишком низкие оценки строк, поскольку планировщик запросов предполагает, что item_id и order_id независимы:

SELECT *
FROM payments
JOIN purchases USING (item_id, order_id)

Я могу использовать такой запрос, чтобы обойти проблему:

SELECT *
FROM payments a
JOIN purchases b ON a.item_id || a.order_id = b.item_id || b.order_id

Однако это вызывает другие неэффективности, и планировщик запросов имеет меньшую гибкость, чтобы рассуждать о запросе.

Другой подход заключается в том, чтобы ввести сгенерированный столбец, который объединяет идентификаторы, но это повысит требования к пространству таблицы, если она будет проиндексирована, и будет эквивалентно предыдущему подходу, если это виртуальный столбец.

Есть ли способ сообщить планировщику запросов, как оценить количество элементов в группе столбцов без этих компромиссов?

Всего 1 ответ


Я бы попробовал расширенную статистику для обеих таблиц:

CREATE STATISTICS purchases_ext (dependencies)
   ON item_id, order_id FROM purchases;

ANALYZE purchases;

CREATE STATISTICS payments_ext (dependencies)
   ON item_id, order_id FROM payments;

ANALYZE payments;

Затем оптимизатор может добавить поправочный коэффициент к оценке.


Есть идеи?

10000