#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
содержит nACCESS SHARE
блокировку таблицы, которая блокирует такие команды, какTRUNCATE
,DROP TABLE
и вакуумное усечение. -
Драйверу не нужно отправлять эти дополнительные инструкции
BEGIN
andCOMMIT
, которые приведут к ненужным обходам клиент-сервер.