【发布时间】:2017-10-07 12:31:44
【问题描述】:
我在 PostgreSQL 数据库中有一个包含 +50M 记录的大型数据集,需要大量计算、内连接。
Python 是 Psycopg2 的首选工具。
使用fetchmany 的 20,000 条记录运行该过程需要几个小时才能完成。
需要按顺序执行,因为需要单独获取 50M 的每条记录,然后需要运行另一个查询(在下面的示例中),然后才能返回结果并保存在单独的表中。
在每个表(总共 5 个表)上正确配置了索引,并且复杂查询(返回计算值 - 示例如下)大约需要 240MS 来返回结果(当数据库不在加载)。
Celery 用于在单独的表中处理计算值的数据库插入。
我的问题是关于减少整体运行时间和更快产生结果/计算的常用策略。 换句话说,什么是一个有效的方法来遍历所有记录,通过第二个查询计算一个字段的值然后保存结果。
更新:
在试图混淆敏感细节时,我无意中错过了一条重要信息。很抱歉。
原始SELECT 查询计算从不同表聚合的值如下:
SELECT CR.gg, (AX.b + BF.f)/CR.d AS calculated_field
FROM table_one CR
LEFT JOIN table_two AX ON EX.x = CR.x
LEFT JOIN table_three BF ON BF.x = CR.x
WHERE CR.gg = '123'
GROUP BY CR.gg;
PS:SQL 查询是由我们经验丰富的 DBA 编写的,所以我相信它已经过优化。
【问题讨论】:
-
在 psql 中运行相同的查询 naked,以估计传入/传出 pyhon 前端所需的时间,以及将数据转换为/的时间来自python结构。
-
... and a single query takes around ...什么是单一查询 ?? -
@wildplasser 每次查询数据集时的单个查询(包括连接命令),即:
select * from table_one er left join table_two ex ON ex.x = er.y left join table_three ef on ef.x = er.z where er.gg = '123' group by er.gg; -
还有:什么是不是 单一查询 ???注意:
group by er.gg没有用,因为只有一组(并且没有聚合) -
好吧:不要那样做! (这将花费两个往返数据库 + 解析+执行 per item )相反,让数据库计算 all 的值 all您需要的记录,并在一次扫描中获取所有结果。
标签: python database postgresql performance pandas