2010-04-19 2 views
2

У меня есть около 10 таблиц с более чем 2 миллионами записей и один с 30 миллионами. Я хотел бы эффективно удалить старые данные из каждой из этих таблиц.эффективно обрезать таблицы postgresql

Мой общий алгоритм:

  • создать временную таблицу для каждой большой таблицы и заполнить его с новыми данными
  • усечение исходных таблиц
  • копию TMP данных обратно в исходные таблицы, используя: «вставка в исходную таблицу (выберите * из tmp_table) «

Однако последний шаг копирования данных назад занимает больше времени, чем я хотел бы. Я думал об удалении исходных таблиц и создании временных таблиц «постоянным», но я теряю информацию об ограничении/внешнем ключе.

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

Спасибо.

ответ

2

Самый быстрый процесс, скорее всего, будет именно так, как вы обрисовал в общих чертах:

  1. Копирование новых данных во временную таблицу
  2. Дроп индексы и внешние ключи
  3. уронить старый стол
  4. Copy временная таблица обратно к имени старой таблицы
  5. Перестроить индексы и внешние ключи.

The Postgres manual имеет некоторые предложения по исполнению, которые могут или не могут применяться. Честно говоря, значительно быстрее отбросить таблицу, чем сбросить миллионы строк (так как каждое удаление выполняется кортежем по кортежу), и значительно быстрее вставить миллионы строк в таблицу без ограничений или индексов (поскольку каждое ограничение должны быть проверены, и каждый индекс должен быть обновлен для каждой записи, удалив все ограничения, вы ограничиваете это одной строкой индекса и одной проверкой для ограничения).

1

«Стандартное» решение для этих проблем обычно включает разбиение таблиц на соответствующий ключ, так что когда вам нужно удалить старые данные, вы можете просто удалить весь раздел - безусловно, самое быстрое удаление, которое вы когда-либо получите ,

Однако разделение в PostgreSQL не так просто, как некоторые другие базам данных - нужно перенести данные вручную с помощью триггеров, и есть предостережения (например, глобальные первичные ключей)

ВИДЕТЬ PostgreSQL manual on Partitioning

Смежные вопросы