Arm79 |
---|
Нашел 2 варианта: внешним шедулером запускать create table либо непосредственно в триггерной процедуре. |
можно написмать автосоздание триггером, но, при опасениях за скорость, вызывать его по шедъюлеру, заранее, вставляя нечто, что не пройдёт по констрайнтам. напрмире совать Null в not nullable. Если конечно триггер правильно написан
Arm79 |
---|
Наверное, лучше внешним, чтобы на нагруженной базе не анализировать постоянно метасхему. |
а её не надо "всё время" анализировать руками. надо обрабатывать попытку сходить мимо тазика. если это
есть одно но -- в головной таблице не должно быть записей вообще -- иначе динамическое создание партиции (и все последующие попытки) рискует встать в очередь за автовакуумом.
Arm79 |
---|
Да и стремно как то из триггера создавать таблицы - а если одновременно придет несколько транзакций - это что, будет несколько попыток создать новую партицию? |
остальные подождут (вот поэтому создать заранее -- таки дешевле. -- не ждать десяткам конкурентов), и придут с исключением -- "таблица уже есть", которые просто проигнорируете и вернётесь на вставку
ну и чтобы вот это всё не откатывать в случае отката вставляющей -- создание делается в автономии.
Arm79 |
---|
Самое интересное - как дать знать триггеру что появилась новая партиция. В энторнетах в примерах используют динамический SQL (через execute). Мне одному кажется, что это медленно? |
для 30+ партиций писать case when /elsif с полным текстом SQL в каждой ветке -- несколько накладно.
я пользуюсь динамикой.
мыслимы модификаторы пж--диалекта с INSERT по tableoid . почему бы их не реализовать -- я не догоняю.Arm79 |
---|
А что случится, если на таблице, в которую ежесекундно пишут несколько сот транзакций, изменить триггерную процедуру? Текущие транзакции откатятся? Или будут ждать обновления? |
текущие транзакции завершатся со старым телом триггера. (по старой версии этой же записи в pg_proc).
но тут вопрос крайне интересный на предмет нет ли тут дырочки в acid -- я его сам ни разу до конца не думал.
(это самый быстрый способ изменить текущую логику. не требующий блокировки таблицы, в отличии от DROP TRIGGER/CREATE TRIGGER). что порождает известные сомнения в его кошерности
Arm79 |
---|
Вопрос №2: первичные ключи Каким образом обеспечить уникальность первичного последовательного ключа для всех партиций? Вместо SERIAL/BIGSERIAL создать SEQUENCE имя_мастертаблицы и в партициях ставить у поля Id DEFAULT nextval('имя_мастертаблицы')? Или существуют другие практики? |
если вы скажете предку serial -- то в детях оно само станет nextval..... (потому что serial -- это некствал + пара доп условий).
я видел [руками] еще и триггерное поддержание "центра" звизды (бессмысленной таблички пк-еев детей) -- исключительно с целью поддержания unique сквозь всю гирлянду партиций. стоит ли это делать в действительно сильно нагруженном случае -- вопрос открытый. но, на крайняк -- всегда можно будет отключить (очистить тело триггерной ф-ии триггера поддержания центра).