эффективно обрезать таблицы postgresql - PullRequest
2 голосов
/ 20 апреля 2010

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

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

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

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

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

Спасибо.

Ответы [ 2 ]

2 голосов
/ 20 апреля 2010

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

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

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

1 голос
/ 21 апреля 2010

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

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

См. Руководство PostgreSQL по созданию разделов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...