Есть ли способ явно указать планировщику запросов Postgres, что столбцы являются зависимыми? - PullRequest
1 голос
/ 26 марта 2020

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

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 Ответ

1 голос
/ 26 марта 2020

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

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;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...