Мое предложение об архивации:
- Создать
archive_tablespace
(если вы хотите, вы можете отделить оборудование в архиве)
Создавайте таблицы. Например, мы хотим заархивировать сообщения таблицы.
create table posts_all ( LIKE public.posts) ;
create table posts_archive () inherits ( public.posts_all) ;
alter table public.posts inherits ( public.posts_all ) ;
После этого у нас будет две новые таблицы: public.posts_all (с такими же столбцами, как в сообщениях) для запроса всех сообщений (архив и производство) и public.posts_archive для запроса всех сообщений архива. Public.posts будет наследовать от posts_all.
Вставки должны идти по-старому (в таблицу public.posts), если вы не напишите триггеры на posts_all для перенаправления вставок в таблицу posts. Если у вас есть разделение, это будет сложнее. С работающим приложением и до переноса старых данных вам не нужно ничего менять в коде приложения, чтобы работать с этим подходом.
Создать архив схемы для логического разделения. Я предлагаю разделить архивные данные на некоторый период времени (год или месяц), если это возможно (archive_2005).
Создать архивные таблицы в схеме archive_year
create table archive_2005.posts (
check(record_date >= '2005-01-01 00:00:00'::timestamp
and record_date < '2006-01-01 00:00:00'::timestamp)
) inherits (posts_archive) tablespace archive_tablesapce;
После этого у вас появятся новые записи таблицы в схеме archive_2005, и планировщик postgresql будет знать, что данные существуют только в заданный период времени. Если вы запросите другой период времени, postgresql не будет искать в этой таблице.
Создайте функции / процедуры / триггеры для перемещения данных в архивные таблицы.
- Выполняйте архивирование один раз за период времени (год здесь) и очищайте старую таблицу или делайте это автоматически с помощью триггеров (тяжелее при автовакууме) Есть много преимуществ и недостатков в обоих методах.
Если реализовано:
- Может запрашивать архив (выбрать * из posts_archive), все (выбрать * из posts_all) и производственные (выбрать * из public.posts) данные отдельно
- Можно сделать дамп архивных схем отдельно и легко сбросить каскад на них. pg_dump -s archive_2005 datase_name отбрасывание схемы архив_2005 каскад; - будьте осторожны, потому что он удаляет все связанные таблицы
- Старые данные разделены физически табличным пространством и логически схемой.
- Довольно сложная структура для управления процессом архивирования
- Может создавать разные индексы для производственных и архивных таблиц для оптимизации запросов к обоим (меньшие и специализированные индексы = более быстрые запросы и меньше места требуется)
- Если у вас есть многораздельные таблицы (по годам или месяцам), процесс архивирования будет состоять в том, чтобы просто переместить всю таблицу
archive_tablespace
или просто изменить ее для наследования от posts_archive (я не проверял это)
- Если вы не хотите получать доступ к старым (заархивированным) данным, вам не нужно ничего менять в приложении.
Это общая техника, и вы должны адаптировать ее к вашим потребностям. Любые предложения по улучшению этого?
Дальнейшее чтение: наследование PostgreSQL , разбиение
Create tables (table posts example):
. Можете ли вы объяснить этот конкретный шаг, касающийся общего количества таблиц и того, как наследование между таблицами связано друг с другом?posts
,posts-all
илиposts-archive
), который существует только для представления всего набора данных?