партиционируемой таблице (конкурентно) не зная имен партиций?
Т.е. партиции живут своей жизнь, бизнес логика иногда создает новые, старые удаляет. Из-за этого не получится сделать миграцию, где я пропишу партиции по конкретным именам для создания индекса сначала конкурентно на них а потом на мастер таблице.
А создавать индекс не конкурентно на всей таблице не хочется из-за локов в проде(
почему не по всем? какая в этом логика? и причем тут логи на проде?
Нужны на всех партициях. Не логи а локи, исправил) Думал сделать в функции plpgsql но они транзакционные и конкурентно создавать индексы не получится. Цель - создать индексы на всех партициях не зная их имен конкурентно
не надо знать их имена. можно найти имена всех партиций и динамически сформировать create index
Не понял как. Найти имена всех партиций через pg_inherits? Для этого нужна функция а она транзакционная. Другого способа я не знаю(
у меня сделано так... CREATE OR REPLACE VIEW ibt_processing.v_partitions AS SELECT tbl.sch_name, tbl.tbl_name, tbl.borders[1]::timestamp with time zone AS range1, tbl.borders[2]::timestamp with time zone AS range2 FROM ( SELECT pt.sch_name, pt.tbl_name, regexp_match(pg_get_expr(c1.relpartbound, c1.oid), 'FOR VALUES FROM \(''(\d\d\d\d-\d\d-\d\d.*)''\) '::text || 'TO \(''(\d\d\d\d-\d\d-\d\d.*)''\)'::text) AS borders FROM ibt_processing.part_tables pt JOIN pg_class c2 ON pt.tbl_name::text = c2.relname AND c2.relkind = 'p'::"char" JOIN pg_inherits i ON c2.oid = i.inhparent JOIN pg_class c1 ON i.inhrelid = c1.oid AND c1.relpartbound IS NOT NULL JOIN pg_namespace n ON c1.relnamespace = n.oid AND pt.sch_name::text = n.nspname) tbl;
Обсуждают сегодня