2015-07-22 4 views
6

Postgres документации сказано, что условия в таблицы разделов не должны перекрыватьсяБезопасно ли использовать разбиение таблиц postgres с перекрывающимися ограничениями?

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

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

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

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

Я попытался создать таблицы разделов вручную с перекрывающимися ограничениями update_date, и postgres не жаловался, я даже выполнил поиск, и обе таблицы были использованы в плане, поэтому, похоже, он работает нормально, но документация говорит, что ограничения могут " t перекрывает, почему?

безопасно создавать разделы с перекрывающимся ограничением, если у меня есть правильные триггеры и обслуживание?

UPD:

CREATE TABLE master (text_value text, update_date timestamp); 

CREATE TABLE partition_year (
    CHECK (update_date >= DATE '2015-01-01' AND update_date < DATE '2015-12-31') 
) INHERITS (master); 

CREATE TABLE partition_month (
    CHECK (update_date >= DATE '2015-07-01' AND update_date < DATE '2015-8-01') 
) INHERITS (master); 

-- in production this would be handled by trigger 
insert into partition_year(text_value, update_date) values ('year', '2015-01-02'); 
insert into partition_month(text_value, update_date) values ('month', '2015-07-02'); 

-- this scans only year partition 
explain select * from master where update_date = '2015-01-02'; 

-- this scans both year and month partition 
explain select * from master where update_date = '2015-07-02'; 

этот пример показывает, что Postgres читает как год и месяц partititon и не слишком заботится об их перекрытии

+1

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

ответ

0

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

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

  • Нет связанных вопросов^_^