SQLAlchemy: лучше (быстрее?) Совершать небольшие сессии или большие? - PullRequest
0 голосов
/ 08 октября 2018

Для задачи записи / обновления большого количества строк в таблице в postgreSQL с использованием sqlalchemy ORM, было бы быстрее / эффективнее фиксировать каждую строку или добавлять все строки в сеанс перед фиксацией?

Например (1)

for foo in bar:
    session.add(foo)
    session.commit()

или: (2)

for foo in bar:
    session.add(foo)

session.commit()

Я провел грубый тест, рассчитав время выполнения скрипта python для n =20 строк и результаты (1) с очень небольшим отрывом, хотя я думаю, что это может быть просто шумом.

1 Ответ

0 голосов
/ 08 октября 2018

Хорошо, я сделал больше исследований, и наткнулся на вероятный ответ в списке рассылки SQLAlchemy в группах Google.Авторы обращаются к г-ну Саймону Кингу за следующим ответом:

Я думаю, что идея обработки строк в кусках состоит в том, чтобы ограничить использование памяти процессом Python.Пока вы не вызовете session.flush (), все ваши изменения хранятся в памяти.Для небольшого количества строк это не проблема, но для огромного количества это может быть.

На практике это может на самом деле не иметь значения для этого примера, потому что конфигурация сеанса по умолчанию - автоматическая очистка всякий раз, когда вы вызываете session.query ().

Относительно того, является ли это предпочтительным по сравнению с Table.update (), это действительно зависит от вашего варианта использования.Table.update () обычно будет быстрее, потому что вся работа будет выполняться самой базой данных.Если изменения, которые вы пытаетесь внести, могут быть выражены в SQL (т. Е. Они не имеют сложных зависимостей или не требуют внешней информации), и вы готовы впоследствии повторно синхронизировать сеанс, если это необходимо, тогда Table.update () подойдет.

Надеюсь, это поможет,

Симон

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...