У меня есть две таблицы, подобные этой: (Мои настоящие таблицы отличаются. Я использую их для упрощения проблемы.)
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
Однако это вызывает другие недостатки, и у планировщика запросов меньше гибкости, чтобы рассуждать о запросе.
Другой подход заключается в том, чтобы ввести сгенерированный столбец, объединяющий идентификаторы, но он увеличит требования к пространству таблицы, если он будет проиндексирован, и это было бы эквивалентно предыдущему подходу, если бы это был виртуальный столбец.
Есть ли способ сообщить планировщику запросов, как оценивать количество элементов в группе столбцов без этих компромиссов?