我有一个PostgreSQL 10数据库,其中包含两个表,两个表都具有两个分区级别(按列表)。
根据日期,数据现在存储在5K到10K分区表(上述两个表的孙子表)中。
每个孙子分区表有三个索引,但是未对完成分区的两列进行索引。 (因为我认为这不是必需的吗?)
我正在观察的问题是查询计划时间很慢,但是查询执行时间却很快。
即使在查询中对分区值进行了硬编码也是如此。
研究此问题后,我认为PostgreSQL 10使用线性搜索来查找分区的元数据是造成此问题的原因。
cf: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
。