首页 > 解决方案 > 处理大文件 + pgsql 表的最佳逻辑

问题描述

我有一个带有多个模式的 postgres 数据库,每个模式都有多个表,每个表都有几百万行。

有时,我必须下载一个包含几百万行的文件,并将每一行与所有表中的每一行进行比较,如果找到该行,我必须更新其中的一列。

我尝试的第一件事是逐行读取文件,在每个模式中的每个表上运行选择查询,如果找到行我运行更新,它在我的测试平台上运行良好,但是对于实际的数据库,它将永远运行,因为它每秒执行大约 1000 个查询(我检查了查询:)SELECT xact_commit+xact_rollback FROM pg_stat_database WHERE datname = 'mailtng_lists';

我尝试的第二件事是将主脚本与连接到数据库的脚本分开,所以我所做的是将大文件分成块,每个块有 100K 行,然后调用将执行连接 X 次的脚本使用以下命令:

foreach($chunks as $chunk) //$chunks is the result of the split command (no problem here)
{
    exec("updater.php $chunk");
}

但它根本没有任何改进,每秒的查询数仍然很低,所以我尝试的最后一件事是做同样的事情,但使用 shell_exec 所以脚本不必等待输出,但服务器崩溃了我有 173 个块,因此调用了 173 个 php 实例。

关于如何处理这种情况的任何想法?

标签: phppostgresqlfile

解决方案


推荐阅读