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