我在带有分区的 postgresql 中加载数据的时间太长是正常的吗?

It's normal that my data loading in postgresql with partitions takes too long?

提问人:Emanuel Burgos 提问时间:10/28/2023 最后编辑:Emanuel Burgos 更新时间:10/28/2023 访问量:40

问:

我有一个数据库,每天必须有大约 20,000 条记录。 从 2022 年到 2024 年。 我为 2022 年和 2023 年的每个季度创建了 6 个分区。 2022 年至 2023 年间总共有 1400 万条记录。 使用 python 脚本加载 1 天的数据时,没有分区,需要 1-4 分钟,但添加分区时最多需要 10 分钟。这正常吗?恐怕添加更多数据需要更长的时间。

有什么方法可以使这不需要这么长时间吗?

DDL 主体表

CREATE TABLE public.orders (
    id varchar(20) NOT NULL,
    "orderType" varchar(20) NULL,
    description text NULL,
    "createdDate" timestamp NULL,
    samples json NULL,
    discarded bool NULL,
    "customerId" varchar(5) NULL,
    "originId" varchar(4) NULL,
    "labTestGroups" json NULL,
    prices json NULL,
    tax varchar(1) NULL,
    status varchar(20) NULL
)
PARTITION BY RANGE ("createdDate");
CREATE INDEX "orders_createdDate_idx" ON ONLY public.orders USING btree ("createdDate");

我的分区的 DDL 是这样的 =

CREATE TABLE public.orders2022_q1 PARTITION OF public.orders  FOR VALUES FROM ('2022-01-01 00:00:00') TO ('2022-04-01 00:00:00');
数据库 PostgreSQL 分区 postgresql-14

评论

2赞 Frank Heikens 10/28/2023
在 20.000 到 1 分钟内编写 4 条记录,恕我直言已经很慢了。如果平均需要 2 分钟,则每秒只能写入 167 条记录。对于单个 INSERT 语句,我们每秒至少执行 5000 次。使用 COPY 时,它接近每秒 100.000 条记录,但可能会更多。你的脚本在做什么?所涉及的表的 DDL 是怎样的?表和索引
0赞 jjanes 10/28/2023
这将是 8 个分区,而不是 6 个。不,速度和速度差异不正常。除了您显示的索引之外,还有其他索引吗?
1赞 Bohemian 10/28/2023
您的数据大小很小;加载 20000 行需要一两秒钟。我的建议是:不要将应用程序语言用于运营问题。使用 postgres 提供的操作工具:从“/path/to/local/filename”复制 mytable。加载整个数据集时,删除索引,加载,创建索引。

答:

0赞 Zegarek 10/28/2023 #1

asyncpg2016 年可以在 Python 和 PostgreSQL 之间完成 1M 行/秒。

如今,他们宣传 2M/s

即使你坚持使用,或者我猜你现在正在使用,也要确保你知道有多种方法可以做到这一点:2022 年的记录是一天,如果加载需要 1-4 分钟,你就是在加载 - 一秒钟的行(如果你的意思是这是你在 2022 年 2023 年都有多少)。这听起来像是您选择了最慢的逐行插入方法 - 该分数与上面链接中的测试结果相匹配。你略低于这个值的原因可能意味着你的每一行都更重,但也意味着你使用的是字符串插值而不是参数绑定,从而进一步减慢了速度。其他原因,虽然现在不太可能,是psycopg3psycopg214'000'00038356160640

  • ur 和 值非常长description"labTestGroups"prices
  • 您的网络吞吐量阻碍了您
  • 两端的硬件资源都非常缓慢且稀缺

维护索引的同时,直接加载到表中总是比通过分区机制将记录路由到多个表更快,但从您的分数来看,我认为您应该能够在客户端获得更高的性能。