Postgres 11 执行计划 - 查询分区 table where 子句中没有分区键

Postgres 11 execution plan - Querying partitioned table without partition key in where clause

我正在尝试对大小 > 1 TB 的 table(PRT_T1) 进行分区。我选择了 2 个分区键 - entity_id_1 和 entity_id_2 以及散列分区。当两个分区键都不是 where 子句的一部分时,或者假设只有一个分区键是 where 子句的一部分时,我想了解 postgres 的行为。

我检查了 -

的解释计划
select * 
from PRT_T1 as T1 
where T1.entity_id_1=173.

请注意 entity_id_1 和 entity_id_2 列上有索引 执行计划显示首先使用位图堆扫描扫描所有分区,然后使用位图索引扫描。我附上了相同的屏幕截图。

问题是这些分区是顺序扫描还是并行扫描?

散列分区非常无用,除非您想在多个 table 空间中随机分配 I/O 负载,或者您想提高 autovacuum 在 table.

上的性能

任何在 WHERE 条件下没有带相等运算符的完整分区键的查询都必须扫描所有分区。使用散列分区的查询不会比不使用分区更高效。

所有这些分区都是按顺序扫描的。如果 PostgreSQL 执行计划使用并行查询,您总是可以通过“收集”节点的存在来判断。