Postgres 性能优化提示:加载数十亿行

4 投票
7 回答
4339 浏览
提问于 2025-04-16 11:38

我正在进行一个项目,想从70GB的xml文件中提取很多信息,并把这些信息加载到一个关系型数据库里(这里是postgres)。我现在使用python脚本和psycopg2来进行数据插入等操作。可是我发现,随着某些表中行数的增加(最大的表大约有500万行),脚本的速度变得非常慢。原本几分钟就能完成的操作,现在却要花一个小时。

我该怎么做才能加快速度?我用python和psycopg2来做这个任务是不是错了?有没有什么方法可以优化数据库,让这个过程更快?我感觉我可能走错了方向。

7 个回答

1

你可以看看这个网站:http://pgbulkload.projects.postgresql.org/

1

我建议你用COPY命令,而不是用插入(inserts)。因为备份工具就是用这个方法来快速加载数据的。

检查一下这个表里的所有外键,确保它们在目标表中都有对应的索引。更好的做法是,先暂时删除这些外键,然后在复制数据后再重新创建它们。

把checkpoint_segments的默认值从3(也就是3*16MB=48MB)提高到一个更大的数字,比如32(512MB)。确保你有足够的空间来存放这些额外的数据。

如果你能接受在系统崩溃或断电的情况下重新创建或恢复你的数据库集群,那么可以用“-F”选项启动Postgres,这样可以启用操作系统的写缓存。

2

考虑到在数据集还不大的时候,处理速度是相当快的,而现在数据集变大了之后速度变慢了,我猜可能是因为索引的问题。你可以试着在导入数据之前先删除表上的索引,然后在导入完成后再重新创建这些索引。这样应该能加快速度。

撰写回答