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

问题描述 投票:1回答:1

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

python postgresql database-migration data-migration
1个回答
0
投票

如果这将解决您的性能问题,我不是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 

此外,您的网络调用越低,网络调用越多,这可能会降低您的性能,尤其是使用如此大的数据集和如此低的itersize。如果你需要在2000年的批量工作,你可以增加你的itersize并每fetchmany做2000行,例如fetchmany(2000)。 fetchmany在迭代通过所有当前获取的行之前不会进行网络调用。

如果itersize是20000,并且你打电话给fetchmany(2000),那么需要10个fetchmany(2000)进行网络通话。

© www.soinside.com 2019 - 2024. All rights reserved.