为什么子分区不会提高 postgres 中的插入速度性能?

Why does subpartitions not increase insert speed performance in postgres?

我已经安装了 postgres 12 并使用分区进行了测试(如下所示)。我的问题是,为什么插入数据没有显着的性能提升,即使 table 中有 15 亿行,当比较 5 个分区与 5 个分区和 5 个子分区时。

我的目标是在通常很大的 table 秒内快速导入超过 15 亿行的数据,我的印象是,拥有更多分区会减少索引的大小并提高速度正在插入数据。

这是测试设置:

机器:本地电脑,16 GB 内存

Postgres 版本: 12

分区测试: Table a) 5 个散列分区和 5 个散列子分区。 Table b) 5 个散列分区

Table设置(只有 5 个分区的示例)

CREATE TABLE public.only_5_partitions
(
    id integer NOT NULL,
    title character varying COLLATE pg_catalog."default",
    project_id integer
) PARTITION BY HASH (id) ;

--代码示例中未添加所有 3 列的索引,但所有 3 列都有索引。

--分区

CREATE TABLE public.only_5_partitions_0 PARTITION OF public.only_5_partitions
    FOR VALUES WITH (modulus 5, remainder 0)
    PARTITION BY HASH (id);

CREATE TABLE public.only_5_partitions_1 PARTITION OF public.only_5_partitions
    FOR VALUES WITH (modulus 5, remainder 1)
    PARTITION BY HASH (id);

CREATE TABLE public.only_5_partitions_2 PARTITION OF public.only_5_partitions
    FOR VALUES WITH (modulus 5, remainder 2)
    PARTITION BY HASH (id);

CREATE TABLE public.only_5_partitions_3 PARTITION OF public.only_5_partitions
    FOR VALUES WITH (modulus 5, remainder 3)
    PARTITION BY HASH (id);

CREATE TABLE public.only_5_partitions_4 PARTITION OF public.only_5_partitions
    FOR VALUES WITH (modulus 5, remainder 4)
    PARTITION BY HASH (id);

插入的行数:使用此示例代码生成的行数:

INSERT INTO tableb
SELECT generate_series(1,10000000), 'someting new', generate_series(1,10000000);

从测试中可以看出,在table A(只有5个分区)中插入数据或多或少与table B相同。在某些运行中,分区数量较少甚至表现得更好。

在最后一个插入中,我将插入增加到 50 mio 行,以检测性能变化。

I was of the impression, that having more partitions would reduce the size of the indexes and increase the speed of inserting data.

为什么这样会更快?您似乎同时访问了所有分区。您的索引较小,但索引更多,总大小大致相同。如果您一次将插入目标定位到一个分区,您可能会获得一些缓存优势,但您并没有这样做(使用散列分区也不容易做到这一点)。