0

我有一个 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.

4

0 回答 0