Эффективность автоматической фиксации PostgreSQL при отборе запросов

#postgresql #performance #autocommit

#postgresql #Производительность #автоматическая фиксация

Вопрос:

Я использую Psycopg2 для выдачи многих SELECT запросов к моей базе данных Postgres. Эти запросы имеют результат небольшого размера и отправляются с высокой частотой.

Чтобы избежать самостоятельного управления транзакциями (потому что я ленив), я установил autocommit = True в настройках сеанса.

Редактировать: между запросами нет длительной паузы, нет манипуляций с данными, и курсор закрывается сразу после того, как я прекращаю выполнять запросы.

Я хотел бы знать: при выполнении SELECT запросов с высокой частотой возникает ли какое-либо снижение производительности при использовании автоматической фиксации?

Используя Postgres 9.6 и Psycopg 2.7.7. И да, я использую подготовленные инструкции.

Комментарии:

1. На самом деле, это хорошо, потому что вы не сохраняете «простаивающие» транзакции.

2. @a_horse_with_no_name Действительно, это было обоснованием первоначального включения автоматической фиксации, как рекомендовано в документах PsycoPG. Однако мои транзакции выполняют только отборные запросы, и между запросами нет длительных пауз. Аналогично, транзакция будет закрыта сразу после того, как она станет бесполезной. Поэтому я подумал, что это может быть особый случай.

Ответ №1:

Автоматическая фиксация — это правильно, потому что:

  • Снижения производительности не происходит, поскольку транзакции, доступной только для чтения, не требуется запись в журнал транзакций (WAL).

  • Блокировки не удерживаются, как прокомментировал a_horse_with_no_name. Даже a SELECT содержит n ACCESS SHARE блокировку таблицы, которая блокирует такие команды, как TRUNCATE , DROP TABLE и вакуумное усечение.

  • Драйверу не нужно отправлять эти дополнительные инструкции BEGIN and COMMIT , которые приведут к ненужным обходам клиент-сервер.