Postgresql 11 Разделение подробных таблиц на основе столбца в главной таблице в отношении внешнего ключа
Улучшения в декларативном разделении на основе диапазонов в версии 11, похоже, действительно могут работать для моего варианта использования, но я не совсем уверен, как внешние ключи работают с разделами.
У меня есть столы Files -< Segments -< Entries
в котором сотни сегментов на файл и сотни записей на сегмент, поэтому записи порядка 10000 раз больше файлов. Файлы имеют поле CreationDate, и клиенты будут определять срок хранения, чтобы они удаляли старые записи. Все это ясно указывает на разделы на основе даты, поэтому быстрее запрашивать самые последние записи и легко отбрасывать старые.
Первая проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь создать таблицу Files, мне кажется, что я должен включить createDate как часть первичного ключа, чтобы он был в разделе RANGE:
CREATE TABLE Files2
(
FileId BIGSERIAL PRIMARY KEY,
createdDate timestamp with time zone,
filepath character varying COLLATE pg_catalog."default" NOT NULL
) PARTITION BY RANGE (createdDate)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
ERROR: insufficient columns in PRIMARY KEY constraint definition
DETAIL: PRIMARY KEY constraint on table "files2" lacks column "createddate" which is part of the partition key.
Если я опускаю "ПЕРВИЧНЫЙ КЛЮЧ" из определения FileId, я не получаю ошибку, но влияет ли это на эффективность дочерних поисков?
Я также не знаю, как объявить разделы для дочерней таблицы. PARTITION BY RANGE (Files.createdDate)
не работает
Поскольку этот вариант использования возможен только в версии 11, я не нашел много информации об этом и был бы признателен за любые указания! Спасибо!
1 ответ
Я считаю, что это новая функция версии 11. Есть документ, из которого вы можете получить следующую информацию:
"Ограничение первичного ключа должно включать в себя столбец ключа раздела. Попытка создать ограничение первичного ключа, не содержащего столбцы с разделами, приводит к ошибке"