PostgreSQL中具有很多分区的数据库的查询计划时间非常长

时间:2019-01-21 18:36:50

标签: postgresql sql-execution-plan database-partitioning postgresql-10 postgresql-11

我有一个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 msExecution Time: 2.827 ms

0 个答案:

没有答案