Я выполняю несколько запросов SELECT в базе данных postgres, используя psycopg2, но получаю ERROR: Out of shared memory
. Он предлагает увеличить max_locks_per_transaction.
, но это сбивает меня с толку, потому что каждый запрос SELECT работает только с одной таблицей, а max_locks_per_transaction
уже установлен в 512, в 8 раз больше по умолчанию.
Я использую TimescaleDB, которая может быть результатом большего, чем обычно, количества блокировок (возможно, одной для каждого чанка, а не одной для каждой таблицы), но это все еще не может объяснить истощение, когда разрешено так много , Я предполагаю, что здесь происходит то, что все запросы выполняются как часть одной транзакции.
Код, который я использую, выглядит следующим образом.
db = DatabaseConnector(**connection_params)
tables = db.get_table_list()
for table in tables:
result = db.query(f"""SELECT a, b, COUNT(c) FROM {table} GROUP BY a, b""")
print(result)
Где db.query
определяется как:
def query(self, sql):
with self._connection.cursor() as cur:
cur.execute(sql)
return_value = cur.fetchall()
return return_value
и self._connection
:
self._connection = psycopg2.connect(**connection_params)
Нужно ли каким-то образом явно завершать транзакцию, чтобы освободить блокировки? И как я могу сделать это в psycopg2
? Я бы предположил, что при закрытии курсора на __exit__
был неявный конец транзакции. Я знаю, если бы я вставлял или удалял строки, я бы использовал COMMIT
в конце, но это кажется странным, поскольку я не изменяю таблицу.
ОБНОВЛЕНИЕ: Когда я явно открываю и закрываю соединение в цикле, ошибка не отображается. Однако я предполагаю, что есть лучший способ завершить транзакцию после каждого SELECT, чем этот.