Я хотел бы разбить таблицу с 1M + строк по диапазону дат. Как это обычно делается, не требуя большого времени простоя или риска потери данных? Вот стратегии, которые я рассматриваю, но открыты для предложений:
Существующая таблица является главной, а потомки наследуются от нее. Со временем данные перемещаются из основной в дочернюю, но будет период, когда некоторые данные будут в основной таблице, а некоторые - в дочерних.
Создайте новый мастер и дочерние таблицы. Создайте копию данных в существующей таблице в дочерних таблицах (чтобы данные находились в двух местах). Как только у дочерних таблиц появятся самые последние данные, измените все вставки, чтобы они указывали на новую основную таблицу, и удалите существующую таблицу.
postgresql
optimization
partitioning
Эван Эпплби
источник
источник
DELETE FROM ONLY master_table
это решение.Ответы:
Поскольку # 1 требует копирования данных с мастера на дочерний объект, пока он находится в активной производственной среде, я лично пошел с # 2 (создание нового мастера). Это предотвращает сбои в работе исходной таблицы, когда она активно используется, и если есть какие-либо проблемы, я могу легко удалить новый мастер без проблем и продолжить использовать исходную таблицу. Вот шаги, чтобы сделать это:
Создать новую мастер-таблицу.
Создайте детей, которые наследуют от мастера.
Скопируйте все исторические данные в новую основную таблицу
Временно приостановить новые вставки / обновления производственной базы данных
Скопируйте самые последние данные в новую главную таблицу
Переименуйте таблицы, чтобы new_master стал производственной базой данных.
Добавьте функцию для операторов INSERT в old_master, чтобы данные передавались в правильный раздел.
Добавьте триггер, чтобы функция вызывалась на INSERTS
Установите ограничение исключения на ON
Повторно включите ОБНОВЛЕНИЯ и ВСТАВКИ в производственной базе данных.
Настройте триггер или cron, чтобы создавались новые разделы и обновлялась функция для назначения новых данных правильному разделу. Ссылка на эту статью для примеров кода
Удалить old_master_backup
источник
vacuum
не наверстали упущенное или были предотвращены из-за сеансов "простоя в транзакции".Существует новый инструмент под названием pg_pathman ( https://github.com/postgrespro/pg_pathman ), который сделает это автоматически.
Так что-то вроде следующего сделало бы это.
источник