1

我有两个这样的表:(我的实际表是不同的。我用它们来简化问题。)

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

但是,这会导致其他效率低下,并且查询计划器对查询进行推理的灵活性较低。

另一种方法是引入连接 id 的生成列,但如果它被索引,它会增加表的空间需求,如果它是虚拟列,它将等同于先前的方法。

有没有办法告诉查询计划者如何在没有这些权衡的情况下估计一组列的基数?

4

1 回答 1

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;

然后优化器可以在估计中添加一个校正因子。

于 2020-03-26T09:39:36.240 回答