CLUSTER не уменьшает размер таблицы при выполнении других транзакций с использованием Psycopg2 - PullRequest
2 голосов
/ 13 января 2011

Мы запускаем процесс python, который запускает эту хранимую процедуру, которая импортирует файлы из определенного каталога в базу данных postgres. Эти файлы сначала импортируются в таблицу в памяти, а затем в таблицу дисков. Фактический размер таблицы в памяти никогда не должен превышать 30 МБ. Поскольку эта таблица постоянно обновляется, размер таблицы увеличивается (из-за мертвых кортежей). Чтобы держать вещи под контролем, нам нужно выполнить операцию CLUSTER на столе. Я использую модуль psycopg2 для запуска хранимой процедуры и CLUSTER таблицы, но если выполняется процесс импорта, размер таблицы никогда не уменьшается. Но если я останавливаю процесс импорта и запускаю CLUSTER, тогда размер таблицы уменьшается. Из-за соображений производительности я должен иметь возможность запускать команду CLUSTER без остановки процедуры импорта.

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

while True:
    -get the filenames in directory
    for filpath in  filenames:
        conn = psycopg2.connect("dbname='dbname' user='user' password='password'")
        cursor = conn.cursor()
        # Calls a postgresql function that reads a file and imports it into 
        # a table via INSERT statements and DELETEs any records that have the 
        # same unique key as any of the records in the file.
        cursor.execute("SELECT import('%s', '%s');" % (filepath, str(db_timestamp))
        conn.commit()
        cursor.close()
        conn.close()
        os.remove(get_media_path(fname))

С аналогичным объектом conn я хочу запускать команду CLUSTER один раз в час -

conn = psycopg2.connect("dbname='dbname' user='user' password='password'")
cursor = conn.cursor()
cursor.execute("CLUSTER table_name")
conn.commit()
cursor.close()
conn.close()

Также я попробовал установить -

conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)

Другая часть информации - У меня все это работает в среде Django. Я не мог использовать объекты соединений django для выполнения этой задачи, потому что - django не смог освободить соединения с моим потоковым кодом, и вскоре база данных перестала принимать соединения. Может ли это смешанное окружение повлиять на psycopg?

Несколько наблюдений -

  1. Запуск команды CLUSTER при запуске процесса импорта - размер не уменьшается
  2. Когда я прекращаю процесс импорта, а затем запускаю CLUSTER - размер уменьшается
  3. Когда я прекращаю процесс импорта и запускаю процесс импорта обратно, а после этого запускаю команду CLUSTER - размер уменьшается

Есть мысли по поводу проблемы?

Ответы [ 2 ]

3 голосов
/ 13 января 2011

Из руководства:

Когда таблица группируется, ACCESS EXCLUSIVE блокировка приобретена на Это. Это предотвращает любую другую базу данных операции (как чтение, так и запись) работать на столе до КЛАСТЕР закончен.

Вы уверены, что вам нужно кластер каждый час? Благодаря лучшему коэффициенту заполнения и автоочистке ваш стол не будет сильно расти, и в нем не будет мертвых кортежей.

1 голос
/ 15 января 2011

ОК - Я нашел виновника.

Проблема была в том, что кластер или вакуум не удаляли мертвые кортежи, потому что происходило странное взаимодействие, когда мы использовали pstcopg2 непосредственно в среде django.После изоляции кода psycopg и удаления кода, связанного с django, из import-процесса все работало нормально.Это решило проблему, и теперь я могу вакуумировать или кластеризовать ее, не останавливая процесс импорта.

...