Postgresql 有没有办法明确告诉Postgres查询计划器列是依赖的?

Postgresql 有没有办法明确告诉Postgres查询计划器列是依赖的?,postgresql,query-planner,Postgresql,Query Planner,我有两张这样的桌子: (我的实际表格不同。我使用这些表格来简化问题。) 当我发出这样一个查询时,我得到的行估计值太低,因为查询计划器假定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.ite

我有两张这样的桌子: (我的实际表格不同。我使用这些表格来简化问题。)

当我发出这样一个查询时,我得到的行估计值太低,因为查询计划器假定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的生成列,但如果表被索引,则会增加表的空间需求,如果表是虚拟列,则与之前的方法相同

有没有一种方法可以告诉查询计划器如何在没有这些折衷的情况下估计一组列的基数?

我会尝试对两个表进行扩展统计:

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;

然后优化器可以向估计值添加一个修正系数。

您尝试过吗?@MartinSmith谢谢!那正是我要找的东西。您已经回答了我的问题。您还应该有一个关于
付款(项目id、订单id)
的索引
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;