|
Секционирование на работающих проектах
|
|||
---|---|---|---|
#18+
Ребята, поделитесь пожалуйста опытом. Postgresql 11+ Какие подходы вы используете при секционировании таблицы, на которую имеются внешние ключи в других таблицах? Есть идея внедрить секционирования для схемы, которая примерно изображена в приложенном файле. Заходит пользователь, чтобы понять какие сообщения ему доступны для чтения, служит таблица user2message Идея в том, что есть крайне старые сообщения с признаком is_expired(около половины), обращение к которым происходит раз в 1000лет. Допустим можно в user2message добавить признак is_expired, чтобы секционировать по нему. Но в user2message есть уникальный ключ user_id+mess_id, postgres требует, чтоб этот уникальный ключ был включен в ключ секционирования. Это первое. Второе, если партиционировать таблицу message по признаку is_expired, так же требуется включить уникальный ключ id в ключ партиционирования, но как тогда быть с document, который ссылается на первичный ключ id таблицы message. Гору видео и доки перелопатил, везде партиционирование в духе - вот у нас таблица, берем и разбиваем по дате. Ни слова про то,что происходит с ключами при этом. Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2020, 11:55 |
|
Секционирование на работающих проектах
|
|||
---|---|---|---|
#18+
kliff, Начиная с postgresql 12, поддерживается ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2020, 12:34 |
|
Секционирование на работающих проектах
|
|||
---|---|---|---|
#18+
fte kliff, Начиная с postgresql 12, поддерживается ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2020, 13:06 |
|
Секционирование на работающих проектах
|
|||
---|---|---|---|
#18+
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 на обоих частях... просто глобальной уникальности не будет обеспечиваться базой. Когда партиционируют по какому то полю таблицу - все ссылающиеся на нее тоже надо партиционировать по тем же критериям. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2020, 13:35 |
|
Секционирование на работающих проектах
|
|||
---|---|---|---|
#18+
Maxim Boguk, А как тогда будет выглядеть создание партицированной таблицы, если у меня будет уникальный ключ user_id+mess_id+is_expired. 2 партиции ведь не получится сделать? По каждому набору user_id+mess_id+is_expired будет партиция создаваться ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2020, 14:59 |
|
Секционирование на работающих проектах
|
|||
---|---|---|---|
#18+
скорее всего что то такое 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); ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2020, 15:49 |
|
Секционирование на работающих проектах
|
|||
---|---|---|---|
#18+
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. Только все ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2020, 15:57 |
|
Секционирование на работающих проектах
|
|||
---|---|---|---|
#18+
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... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2020, 16:03 |
|
Секционирование на работающих проектах
|
|||
---|---|---|---|
#18+
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... Похоже на отменный костыль. Не то, что хотелось бы внедрять ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2020, 16:44 |
|
Секционирование на работающих проектах
|
|||
---|---|---|---|
#18+
kliff Maxim Boguk, А как тогда будет выглядеть создание партицированной таблицы, если у меня будет уникальный ключ user_id+mess_id+is_expired. 2 партиции ведь не получится сделать? По каждому набору user_id+mess_id+is_expired будет партиция создаваться я уже написал - вам не надо глобальный уникальный ключ... вполне себе хватит независимых уникальных по user_id+mess_id на каждой из партиций. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2020, 19:06 |
|
Секционирование на работающих проектах
|
|||
---|---|---|---|
#18+
kliff fte пропущено... Нет, ну зачем так грубо, можно сделать каскадное секционирование по каждому полю, при этом на каждом уровне можно использовать RANGE,LIST,HASH... Похоже на отменный костыль. Не то, что хотелось бы внедрять Это не костыль - это "фича", а уж как ей воспользоваться подумайте сами... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2020, 20:08 |
|
Секционирование на работающих проектах
|
|||
---|---|---|---|
#18+
Maxim Boguk kliff Maxim Boguk, А как тогда будет выглядеть создание партицированной таблицы, если у меня будет уникальный ключ user_id+mess_id+is_expired. 2 партиции ведь не получится сделать? По каждому набору user_id+mess_id+is_expired будет партиция создаваться я уже написал - вам не надо глобальный уникальный ключ... вполне себе хватит независимых уникальных по user_id+mess_id на каждой из партиций. Большое спасибо. Вроде дошло ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2020, 20:21 |
|
|
start [/forum/topic.php?fid=53&fpage=24&tid=1994534]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 138ms |
0 / 0 |