Вертикальное партицирование



В отличие от горизонтального партицирования / шардирования таблица разделяется не по строкам, а по столбцам



Например, из





create table ticket

(

id bigserial primary key not null,

status varchar not null,

assignee varchar null

);




Получается





create table ticket

(

id bigserial primary key not null,

status varchar not null,

);



create table ticket_assignee

(

ticket_id bigserial not null,

assignee varchar null

);




MVCC работает так, что при апдейте строки в таблице создается ее полностью новая версия, даже если поменялась всего одна колонка. Поэтому если таблица большая и часто апдейтится, имеет смысл задуматься о переносе частоизменяющихся столбцов в отдельную таблицу



Но стоит быть аккуратным, если есть запросы, задействующие одновременно и status, и assignee. Поскольку пока это хранится в одной таблице, можно сделать многоколоночный индекс на (status, assignee) и быстрым индекс сканом выполнять запрос. Если таблица поделится, то такое уже станет невозможным: нужно будет либо 1) поискать по таблице ticket по условию на status, а затем поджойнить с ticket_assignee, либо 2) поискать по ticket_assignee по условию assignee, а затем поджойнить с ticket. Если фильтрация по каждому условию по отдельности возвращает много строк, то запрос начнет работать сильно медленнее