PostgreSQL - просмотр или разбиение? - PullRequest
2 голосов
/ 23 января 2012

Я пытаюсь изменить дизайн базы данных Pg, чтобы повысить производительность.Db предназначен для ERP IS и содержит большее количество дат (четыре года).Каждый год находился в отдельной базе данных, что было плохим решением (создание отчетов было проблемой), поэтому я объединил все четыре базы данных в одну ... но ... некоторые таблицы слишком большие!Чтобы повысить производительность, я решил разделить данные на таблицы.У меня есть 2 способа сделать это.

Первый: разделить таблицы на «arch_table» и «working_table» и использовать представления для создания отчетов.

или

Второй: использовать разбиение (скажем, отдельный раздел для каждого года).

Итак, мой вопрос, какой путь лучше?Разметка или какая-то система архивирования?

Ответы [ 2 ]

8 голосов
/ 25 января 2012

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

CREATE TABLE measurement (
    city_id         int not null,
    logdate         date not null,
    peaktemp        int,
    unitsales       int
);

CREATE TABLE measurement_y2006m02 ( ) INHERITS (measurement);
CREATE TABLE measurement_y2006m03 ( ) INHERITS (measurement);
...
CREATE TABLE measurement_y2007m11 ( ) INHERITS (measurement);
CREATE TABLE measurement_y2007m12 ( ) INHERITS (measurement);
CREATE TABLE measurement_y2008m01 ( ) INHERITS (measurement);

Очевидно, что я пропустил немного кода, но вы можете проверить документацию по Разделение таблиц PostgreSQL.Самая важная часть секционирования - убедиться, что вы создаете автоматические сценарии для создания новых разделов в будущем, а также объединяете старые разделы.

Оперативно, когда PostgreSQL запускает ваш запрос, он смотрит на SELECT * FROM measurement WHERE logdate BETWEEN '2006-02-13' AND '2006-02-22';Оптимизатор говорит: «Ага, ха! Я знаю, что здесь, есть раздел. Я просто посмотрю на таблицу measurement_y2006m02 и извлеку соответствующие данные».

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

Имейте в виду, что разбиение в значительной степени является решением для управления данными и может не обеспечивать выигрыша в производительности, который вынаходясь в поиске.Настройка запросов, применение индексов и проверка конфигурации PostgreSQL (postgresql.conf, конфигурации хранилища и конфигурации ОС) могут привести к гораздо большему приросту производительности при разделении ваших данных.

2 голосов
/ 23 января 2012

Вы должны использовать разбиение любым из этих способов.Это именно то, что вам нужно.

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