【问题标题】:Why does subpartitions not increase insert speed performance in postgres?为什么子分区不能提高 postgres 中的插入速度性能?
【发布时间】:2020-07-15 23:56:38
【问题描述】:

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

我的目标是在通常超过 1/4 亿行的大表中快速导入数据,我的印象是,拥有更多分区会减小索引的大小并提高插入数据的速度。

这是测试的设置:

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

Postgres 版本:12

分区测试:表 a) 5 个哈希分区和 5 个哈希子分区。表 b) 5 个哈希分区

Tablesetup(只有 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);

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

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

【问题讨论】:

  • 不同存储系统上的不同表空间中的分区吗?
  • 它们都在同一个表空间中
  • 那么就没有性能提升了。

标签: postgresql postgresql-12


【解决方案1】:

我的印象是,拥有更多分区会减小索引的大小并提高插入数据的速度。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2020-03-19
    相关资源
    最近更新 更多