我有一个 PostgreSQL 10 数据库,其中包含两个表,它们都有两个分区级别(按列表)。
数据现在存储在 5K 到 10K 分区表(上述两个表的孙子表)中,具体取决于日期。
每个子分区表有三个索引,但分区完成的两列没有索引。(因为我不认为这是必要的,不是吗?)
我观察到的问题是查询计划时间非常慢,但查询执行时间非常快。
即使分区值在查询中被硬编码。
研究这个问题时,我认为 PostgreSQL 10 使用线性搜索来查找分区的元数据是造成它的原因。
参见:https ://blog.2ndquadrant.com/partition-elimination-postgresql-11/
所以我决定试用包含上述两个补丁的 PostgreSQL 11:
https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=499be013de65242235ebdde06adb08db887f0ea5 https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h =9fdb675fc5d2de825414e05939727de8b120ae81
Helas,版本更改似乎并没有改变任何东西。
现在我知道 PostgreSQL 不太喜欢有很多分区,但我仍然想了解为什么查询计划器在 PostgreSQL 10 和现在的 PostgreSQL 11 中如此缓慢。
查询的一个示例是:
EXPLAIN ANALYZE
SELECT
table_a.a,
table_b.a
FROM
(
SELECT
a,
b
FROM
table_a
WHERE
partition_level_1_column = 'foo'
AND
partition_level_2_column = 'bar'
)
AS table_a
INNER JOIN
(
SELECT
a,
b
FROM
table_b
WHERE
partition_level_1_column = 'baz'
AND
partition_level_2_column = 'bat'
)
AS table_b
ON table_b.b = table_a.b
LIMIT
10;
在具有 5K 分区的数据库上运行它将返回Planning Time: 7155.647 ms
,但是Execution Time: 2.827 ms
.