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