【发布时间】:2020-09-30 20:50:45
【问题描述】:
我有一张桌子
T (A int, B int, C long, D varchar)
由每个A 分区并由每个B 进行子分区(即,列出每个分区都有一个值)。 A 的基数 B 的基数 T 有大约 60 亿行。
当我运行查询时
select distinct B from T where A = 1;
它会修剪顶级分区(A != 1 所在的分区),但会对所有子分区执行表扫描以查找 B 的不同值。我以为它会知道,基于分区设计,它只需要检查分区约束来确定给定A 的B 的可能值,但可惜,事实并非如此。
A 或B 上没有索引,但每个分区的(C,D) 上都有一个主键,这似乎无关紧要,但我想我应该提一下。我在C 上也有一个 BRIN 索引。知道为什么 Postgres 查询计划器不咨询子分区约束以避免表扫描吗?
【问题讨论】:
标签: postgresql postgresql-12 query-planner