Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 为什么子分区不能提高postgres的插入速度性能?_Postgresql_Postgresql 12 - Fatal编程技术网

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

Postgresql 为什么子分区不能提高postgres的插入速度性能?,postgresql,postgresql-12,Postgresql,Postgresql 12,我已经安装了postgres 12并使用分区进行了测试(如下所示)。我的问题是,为什么在比较5个分区与5个分区和5个子分区时,插入数据(即使表中有¼亿行)没有显著的性能提高 我的目标是在通常具有+¼亿行的大型表中快速导入数据,我的印象是,拥有更多分区将减少索引的大小并提高插入数据的速度 这是测试的设置: 机器:本地pc,16 GB ram Postgres版本:12 分区测试:表a)5个散列分区和5个散列子分区。表b)5个散列分区 CREATE TABLE public.only_5_parti

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

我的目标是在通常具有+¼亿行的大型表中快速导入数据,我的印象是,拥有更多分区将减少索引的大小并提高插入数据的速度

这是测试的设置:

机器:本地pc,16 GB ram

Postgres版本:12

分区测试:表a)5个散列分区和5个散列子分区。表b)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) ;
表设置(示例仅包含5个分区)

--代码示例中未添加所有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相同。在某些运行中,少量分区的性能甚至更好

在上一次插入中,我将插入增加到5000万行,以检测性能变化

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


为什么这会更快?您似乎同时访问了所有分区。索引更小,但更多,总大小大致相同。如果一次将插入对象定位到一个分区,可能会获得一些缓存好处,但这样做并不容易(使用哈希分区也不容易做到)。

分区是否位于不同存储系统的不同表空间中?它们都位于同一表空间中,则性能不会有任何提高。