Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Секционирование на работающих проектах / 12 сообщений из 12, страница 1 из 1
10.08.2020, 11:55
    #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
10.08.2020, 12:34
    #39988124
fte
fte
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Секционирование на работающих проектах
kliff,

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

Начиная с postgresql 12, поддерживается
знаю, я об этом писал выше
...
Рейтинг: 0 / 0
10.08.2020, 13:35
    #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
10.08.2020, 14:59
    #39988234
kliff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Секционирование на работающих проектах
Maxim Boguk,
А как тогда будет выглядеть создание партицированной таблицы, если у меня будет уникальный ключ user_id+mess_id+is_expired. 2 партиции ведь не получится сделать? По каждому набору user_id+mess_id+is_expired будет партиция создаваться
...
Рейтинг: 0 / 0
10.08.2020, 15:49
    #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
10.08.2020, 15:57
    #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
10.08.2020, 16:03
    #39988269
fte
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
10.08.2020, 16:44
    #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
10.08.2020, 19:06
    #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
10.08.2020, 20:08
    #39988390
fte
fte
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Секционирование на работающих проектах
kliff
fte
пропущено...


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


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


Это не костыль - это "фича", а уж как ей воспользоваться подумайте сами...
...
Рейтинг: 0 / 0
10.08.2020, 20:21
    #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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Секционирование на работающих проектах / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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