Проблема производительности с именованным курсором psycopg2 в python - PullRequest
0 голосов
/ 07 мая 2018

После некоторых исследований я обнаружил, что безымянный курсор в python с помощью psycopg2 попытается загрузить весь набор результатов в память моего компьютера, для меня это большая проблема, так как запрашиваемая таблица Postgresql составляет около 1,4 ТБ.по размеру.Я обнаружил, что присвоение имени моему курсору создаст серверный курсор, который будет загружать только количество строк, к которым я его попрошу, используя fetchmany, но выполнение запроса стало значительно медленнее.Есть ли способ ускорить курсор на стороне сервера?* Я пытаюсь загрузить только около 2000 строк, так как это примерно тот размер, который мне нужен для загрузки пакетов.

1 Ответ

0 голосов
/ 01 мая 2019

Я не уверен на 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) для сетевого вызова.

...