Я не уверен на 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
Кроме того, чем ниже ваш размер iters, тем больше сетевых вызовов совершается, и это может замедлять вашу производительность, особенно при таком большом наборе данных и таком низком размере. Если вам нужно работать в пакетах по 2000, вы можете увеличить свой размер и сделать 2000 строк на выборку, например. fetchmany(2000)
. fetchmany не будет выполнять сетевой вызов, пока не выполнит итерацию по всем текущим выбранным строкам.
Если itersize равен 20000, и вы набираете fetchmany(2000)
, потребуется 10 fetchmany(2000)
для сетевого вызова.