提问人:Emanuel Burgos 提问时间:10/28/2023 最后编辑:Emanuel Burgos 更新时间:10/28/2023 访问量:40
我在带有分区的 postgresql 中加载数据的时间太长是正常的吗?
It's normal that my data loading in postgresql with partitions takes too long?
问:
我有一个数据库,每天必须有大约 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');
答:
0赞
Zegarek
10/28/2023
#1
asyncpg
2016 年可以在 Python 和 PostgreSQL 之间完成 1M 行/秒。
如今,他们宣传 2M/s。
即使你坚持使用,或者我猜你现在正在使用,也要确保你知道有多种方法可以做到这一点:2022 年的记录是一天,如果加载需要 1-4 分钟,你就是在加载 - 一秒钟的行(如果你的意思是这是你在 2022 年和 2023 年都有多少)。这听起来像是您选择了最慢的逐行插入方法 - 该分数与上面链接中的测试结果相匹配。你略低于这个值的原因可能意味着你的每一行都更重,但也意味着你使用的是字符串插值而不是参数绑定,从而进一步减慢了速度。其他原因,虽然现在不太可能,是psycopg3
psycopg2
14'000'000
38356
160
640
- ur 和 值非常长
description
"labTestGroups"
prices
- 您的网络吞吐量阻碍了您
- 两端的硬件资源都非常缓慢且稀缺
在维护索引的同时,直接加载到表中总是比通过分区机制将记录路由到多个表更快,但从您的分数来看,我认为您应该能够在客户端获得更高的性能。
评论
从“/path/to/local/filename”复制 mytable
。加载整个数据集时,删除索引,加载,创建索引。