python中名为cursor的psycopg2的性能问题
在做了一些研究之后,我发现python中使用psycopg2的无名游标将尝试将所有结果集加载到我的计算机内存中,这对我来说是一个大问题,因为我查询的Postgresql表的大小约为1.4 TB。我发现给我的游标命名将创建一个服务器端游标,该游标将只加载我将要求它加载的行数,使用“fetchmany”,但执行查询的速度明显变慢。有没有办法加快服务器端游标的速度?python中名为cursor的psycopg2的性能问题,python,postgresql,database-migration,data-migration,Python,Postgresql,Database Migration,Data Migration,在做了一些研究之后,我发现python中使用psycopg2的无名游标将尝试将所有结果集加载到我的计算机内存中,这对我来说是一个大问题,因为我查询的Postgresql表的大小约为1.4 TB。我发现给我的游标命名将创建一个服务器端游标,该游标将只加载我将要求它加载的行数,使用“fetchmany”,但执行查询的速度明显变慢。有没有办法加快服务器端游标的速度? *我尝试只加载大约2000行,因为这大约是我需要批处理的大小。如果这能解决您的性能问题,我不是100%肯定,但您不需要将cursor.f
*我尝试只加载大约2000行,因为这大约是我需要批处理的大小。如果这能解决您的性能问题,我不是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越低,进行的网络调用越多,这可能会降低性能,尤其是在数据集如此大、itersize如此低的情况下。如果您需要以2000行为一批进行工作,您可以增加itersize,并对每个fetchmany执行2000行,例如fetchmany(2000)
。fetchmany在遍历当前获取的所有行之前不会进行网络调用
如果itersize为20000,并且您调用fetchmany(2000)
,则需要10fetchmany(2000)
才能进行网络调用