powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Секционирование на работающих проектах
12 сообщений из 12, страница 1 из 1
Секционирование на работающих проектах
    #39988108
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, поделитесь пожалуйста опытом.

Postgresql 11+

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

Есть идея внедрить секционирования для схемы, которая примерно изображена в приложенном файле. Заходит пользователь, чтобы понять какие сообщения ему доступны для чтения, служит таблица user2message


Идея в том, что есть крайне старые сообщения с признаком is_expired(около половины), обращение к которым происходит раз в 1000лет.

Допустим можно в user2message добавить признак is_expired, чтобы секционировать по нему. Но в user2message есть уникальный ключ user_id+mess_id, postgres требует, чтоб этот уникальный ключ был включен в ключ секционирования. Это первое.

Второе, если партиционировать таблицу message по признаку is_expired, так же требуется включить уникальный ключ id в ключ партиционирования, но как тогда быть с document, который ссылается на первичный ключ id таблицы message.

Гору видео и доки перелопатил, везде партиционирование в духе - вот у нас таблица, берем и разбиваем по дате. Ни слова про то,что происходит с ключами при этом.

Заранее спасибо.
...
Рейтинг: 0 / 0
Секционирование на работающих проектах
    #39988124
fte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kliff,

Начиная с postgresql 12, поддерживается
...
Рейтинг: 0 / 0
Секционирование на работающих проектах
    #39988153
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fte
kliff,

Начиная с postgresql 12, поддерживается
знаю, я об этом писал выше
...
Рейтинг: 0 / 0
Секционирование на работающих проектах
    #39988166
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kliff
Ребята, поделитесь пожалуйста опытом.

Postgresql 11+

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

Есть идея внедрить секционирования для схемы, которая примерно изображена в приложенном файле. Заходит пользователь, чтобы понять какие сообщения ему доступны для чтения, служит таблица user2message


Идея в том, что есть крайне старые сообщения с признаком is_expired(около половины), обращение к которым происходит раз в 1000лет.

Допустим можно в user2message добавить признак is_expired, чтобы секционировать по нему. Но в user2message есть уникальный ключ user_id+mess_id, postgres требует, чтоб этот уникальный ключ был включен в ключ секционирования. Это первое.

Второе, если партиционировать таблицу message по признаку is_expired, так же требуется включить уникальный ключ id в ключ партиционирования, но как тогда быть с document, который ссылается на первичный ключ id таблицы message.

Гору видео и доки перелопатил, везде партиционирование в духе - вот у нас таблица, берем и разбиваем по дате. Ни слова про то,что происходит с ключами при этом.

Заранее спасибо.


Надо is_expired добавлять и в messages и в documents и их тоже отпартиционировать по нему же.
'Но в user2message есть уникальный ключ user_id+mess_id, postgres требует, чтоб этот уникальный ключ был включен в ключ секционирования' - в общем не обязательно... вполне себе можно иметь независимые unique на обоих частях... просто глобальной уникальности не будет обеспечиваться базой.
Когда партиционируют по какому то полю таблицу - все ссылающиеся на нее тоже надо партиционировать по тем же критериям.
...
Рейтинг: 0 / 0
Секционирование на работающих проектах
    #39988234
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,
А как тогда будет выглядеть создание партицированной таблицы, если у меня будет уникальный ключ user_id+mess_id+is_expired. 2 партиции ведь не получится сделать? По каждому набору user_id+mess_id+is_expired будет партиция создаваться
...
Рейтинг: 0 / 0
Секционирование на работающих проектах
    #39988256
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скорее всего что то такое

CREATE TABLE user2message (
user_id int4,
mess_id int4,
is_expired bool
) PARTITION BY RANGE (is_expired, user_id, mess_id);

если is_expired сделать не bool, а int4, то

CREATE TABLE part1 PARTITION of user2message FOR VALUES
FROM (0,1,1) TO (0, MAXVALUE, MAXVALUE);

CREATE TABLE part1 PARTITION of user2message FOR VALUES
FROM (1,1,1) TO (1, MAXVALUE, MAXVALUE);
...
Рейтинг: 0 / 0
Секционирование на работающих проектах
    #39988262
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kliff
скорее всего что то такое

CREATE TABLE user2message (
user_id int4,
mess_id int4,
is_expired bool
) PARTITION BY RANGE (is_expired, user_id, mess_id);

если is_expired сделать не bool, а int4, то

CREATE TABLE part1 PARTITION of user2message FOR VALUES
FROM (0,1,1) TO (0, MAXVALUE, MAXVALUE);

CREATE TABLE part1 PARTITION of user2message FOR VALUES
FROM (1,1,1) TO (1, MAXVALUE, MAXVALUE);


нет, такое не получится. Часть границы не может быть MAXVALUE. Только все
...
Рейтинг: 0 / 0
Секционирование на работающих проектах
    #39988269
fte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kliff
скорее всего что то такое

CREATE TABLE user2message (
user_id int4,
mess_id int4,
is_expired bool
) PARTITION BY RANGE (is_expired, user_id, mess_id);

если is_expired сделать не bool, а int4, то

CREATE TABLE part1 PARTITION of user2message FOR VALUES
FROM (0,1,1) TO (0, MAXVALUE, MAXVALUE);

CREATE TABLE part1 PARTITION of user2message FOR VALUES
FROM (1,1,1) TO (1, MAXVALUE, MAXVALUE);


Нет, ну зачем так грубо, можно сделать каскадное секционирование по каждому полю, при этом на каждом уровне можно использовать RANGE,LIST,HASH...
...
Рейтинг: 0 / 0
Секционирование на работающих проектах
    #39988288
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fte
kliff
скорее всего что то такое

CREATE TABLE user2message (
user_id int4,
mess_id int4,
is_expired bool
) PARTITION BY RANGE (is_expired, user_id, mess_id);

если is_expired сделать не bool, а int4, то

CREATE TABLE part1 PARTITION of user2message FOR VALUES
FROM (0,1,1) TO (0, MAXVALUE, MAXVALUE);

CREATE TABLE part1 PARTITION of user2message FOR VALUES
FROM (1,1,1) TO (1, MAXVALUE, MAXVALUE);


Нет, ну зачем так грубо, можно сделать каскадное секционирование по каждому полю, при этом на каждом уровне можно использовать RANGE,LIST,HASH...


Похоже на отменный костыль. Не то, что хотелось бы внедрять
...
Рейтинг: 0 / 0
Секционирование на работающих проектах
    #39988375
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kliff
Maxim Boguk,
А как тогда будет выглядеть создание партицированной таблицы, если у меня будет уникальный ключ user_id+mess_id+is_expired. 2 партиции ведь не получится сделать? По каждому набору user_id+mess_id+is_expired будет партиция создаваться


я уже написал - вам не надо глобальный уникальный ключ... вполне себе хватит независимых уникальных по user_id+mess_id на каждой из партиций.
...
Рейтинг: 0 / 0
Секционирование на работающих проектах
    #39988390
fte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kliff
fte
пропущено...


Нет, ну зачем так грубо, можно сделать каскадное секционирование по каждому полю, при этом на каждом уровне можно использовать RANGE,LIST,HASH...


Похоже на отменный костыль. Не то, что хотелось бы внедрять


Это не костыль - это "фича", а уж как ей воспользоваться подумайте сами...
...
Рейтинг: 0 / 0
Секционирование на работающих проектах
    #39988396
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk
kliff
Maxim Boguk,
А как тогда будет выглядеть создание партицированной таблицы, если у меня будет уникальный ключ user_id+mess_id+is_expired. 2 партиции ведь не получится сделать? По каждому набору user_id+mess_id+is_expired будет партиция создаваться


я уже написал - вам не надо глобальный уникальный ключ... вполне себе хватит независимых уникальных по user_id+mess_id на каждой из партиций.


Большое спасибо. Вроде дошло
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Секционирование на работающих проектах
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]