我的数据加载到postgresql分区需要很长时间,这是正常的吗?

elcex8rz  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(153)

我有一个数据库,每天必须有大约20,000条记录。从2022年到2024年。我为2022年和2023年的每个季度创建了6个分区。在2022年和2023年之间总共有1400万条记录。当用Python脚本加载1天的数据时,没有分区,需要1-4分钟,但是在添加分区的时候需要10分钟。这是正常的吗?我担心添加更多的数据需要更长的时间。
有什么办法可以让这不需要这么长时间吗?
主表

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");

字符串
我的分区的最小值是这样的=

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');

lvmkulzt

lvmkulzt1#

asyncpg可以在Python和PostgreSQL in 2016之间执行100万行/秒。
现在他们宣传的是2 M/s。
即使你坚持使用psycopg3psycopg2,我猜你现在正在使用,也要确保你知道有多种方法可以做到这一点:2022年的14'000'000记录是38356一天,如果加载需要1-4分钟,你每秒加载160-640行(如果你的意思是2022年和2023年你都有那么多钱,那就是一半)。听起来你选择了最慢的,逐行插入方法-该方法的得分与上面链接中的测试结果相匹配。您略低于该方法的原因可能意味着每一行都较重,但也可能是您使用了字符串插值而不是参数绑定,从而进一步减慢了速度。其他原因(尽管目前不太可能)是

  • 您的description"labTestGroups"prices值非常长
  • 您的网络吞吐量正在拖您的后腿
  • 任何一端的硬件资源都异常缓慢且稀缺

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

相关问题