在 python 中命名为游标的 psycopg2 的性能问题



经过一些研究,我发现使用 psycopg2 的 python 中的无名游标将尝试将所有结果集加载到我的计算机内存中,这对我来说是一个大问题,因为我正在查询的 Postgresql 表的大小约为 1.4 TB。我发现为我的游标命名将创建一个服务器端游标,该游标只会加载我要求它的行数,使用"fetchmany",但执行查询的速度明显变慢了。有没有办法加快服务器端光标的速度? *我尝试只加载大约 2,000 行,因为这大约是我需要批次的大小。

如果这可以解决您的性能问题,我不是 100% 肯定,但您不需要将cursor.fetchmany()与服务器端光标一起使用。您可以只迭代命名游标。

with psycopg2.connect(db_uri_string) as conn:
cursor = conn.cursor(name='cursor_name')
cursor.itersize = 20000
query = "SELECT * FROM ..."
cursor.execute(query)
for row in cursor:
# process row 

此外,迭代大小越低,进行的网络调用就越多,这可能会降低性能,尤其是在如此大的数据集和如此低的迭代大小的情况下。如果您需要以 2000 为批次工作,您可以增加迭代大小并每次读取执行 2000 行,例如fetchmany(2000).Fetchmany 在遍历所有当前提取的行之前不会进行网络调用。

如果迭代大小为 20000,并且您调用fetchmany(2000),则进行网络调用需要 10fetchmany(2000)

最新更新