powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / вопрос по тригерам (INSTEAD + AFTER)
15 сообщений из 15, страница 1 из 1
вопрос по тригерам (INSTEAD + AFTER)
    #39319711
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем бобра
Подскажите плиз:
если в случае insert создано правило instead, где мы подменили операцию insert вставкой в другую таблицу (наследованную от главной) (таким образом пришлось обходить ошибку hypernate)

как можно запустить, после выполнения операции instead, еще тригеры, которые были назначены на AFTER?
...
Рейтинг: 0 / 0
вопрос по тригерам (INSTEAD + AFTER)
    #39319743
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LegushkaВсем бобра
Подскажите плиз:
если в случае insert создано правило instead, где мы подменили операцию insert вставкой в другую таблицу (наследованную от главной) (таким образом пришлось обходить ошибку hypernate)

как можно запустить, после выполнения операции instead, еще тригеры, которые были назначены на AFTER?

Никак или всю логику after триггеров скопировать в instead of триггер.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
вопрос по тригерам (INSTEAD + AFTER)
    #39319759
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извините сразу сглупил:
я же вставляю в наследуемую таблицу. и там надо создать все эти тригеры before/after как на мастер таблице
должно получится красивое решение)
...
Рейтинг: 0 / 0
вопрос по тригерам (INSTEAD + AFTER)
    #39319789
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushkaизвините сразу сглупил:
я же вставляю в наследуемую таблицу. и там надо создать все эти тригеры before/after как на мастер таблице
должно получится красивое решение)
ничего красивого в таком хенджобе нет. рутина.

т.е. вы в старой своей задаче предка подменили вьюхой, на неё повесили инстеад в партиции, а теперь хотите взад ваши триггера, которые в прошлый раз сетом переменой в replika пробрасывали ? или только некоторые ? тогда вам возможно надо бы двойной мастернинг. чтобы инсерт триггера не множить. а все delete/update -- в любом случае на конечных партициях должны болтаться -- в предке этих событий не происходит.

или это другой случай ?
...
Рейтинг: 0 / 0
вопрос по тригерам (INSTEAD + AFTER)
    #39319833
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,
почему так сделано, причина и способы решения были здесь:
http://stackoverflow.com/questions/83093/hibernate-insert-batch-with-partitioned-postgresql

а главная причина почему это не совсем обычное партицирование:
на мастер таблицу изначально около того 50 внешних FK с каскадами и без, на любой вкус, причем на одном филиале их 30 на другом их 60 и филиалов докучи, на те таблицы в свою очередь еще вереница FK, и таких итераций много (и есть ограничение: нельзя наследовать если есть внешние FK)

решение хоть и спорное: сохранить функционал внешних FK , абстрагироваться от управления этой вереницы, оставить как есть и остановится на поддержке квадратных колес и костылей одной мастер таблицы (которую надо партицировать), вот сюда и решено добавить новых тригеров чеков и подмены функции вставки...
...
Рейтинг: 0 / 0
вопрос по тригерам (INSTEAD + AFTER)
    #39319867
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushka,

а , ещё один способ получить непустой returning. причем в before партицировании. занятно
снкс. надо куда--нть прикрутить при случае.

я знаю, как напрямую -- в after, но там накладной постфактумный delete from only master никому не нравится, поэтому обычно обходятся без ретурнинга.

пс про кучу фк на партицированной табле не понял. у вас что, центр звезды ведётся, или вы все подчиненки партицируете по тому же принципу ? (а множественных ссылей нет)
...
Рейтинг: 0 / 0
вопрос по тригерам (INSTEAD + AFTER)
    #39319896
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,
вроде добился промежуточного результата: и гибернейт не ругается
и записи сохраняются и апдейтятся

только пока приятного мало: жуткие тормоза)

проверил один план
как никрути:
Код: sql
1.
select id, city_id from master_partkey where id = 33666532 limit 1 

даст одну строку: id = 33666532, city_id = 4


Код: sql
1.
select mc.* from master mc where mc.id = 33666532  and mc.city_id = 4 

обойдет только одну партицию где город = 4


но вот такой запрос, (пробовал разные варианты):
Код: sql
1.
2.
with p (select city_id from master_partkey where id = 33666532 limit 1) 
select mc.* from p inner join master mc on mc.id = p.id and mc.city_id = p.clinic_id 

идет по всем партициям-городам о_О


Код: sql
1.
2.
with p (select city_id from master_partkey where id = 33666532 limit 1) 
select mc.* from p inner join lateral (select mc.* from master mc where mc.id = p.id and mc.city_id = p.clinic_id limit 1) mc on true 

тоже лезет во все партиции

как правильно построить последний запрос, что бы при входящем указанном ИД мы сразу пошли по одному городу?
...
Рейтинг: 0 / 0
вопрос по тригерам (INSTEAD + AFTER)
    #39319907
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushka,

Вместо `WITH` воспользуйтесь классическим подзапросом.
...
Рейтинг: 0 / 0
вопрос по тригерам (INSTEAD + AFTER)
    #39319916
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorovLegushka,

Вместо `WITH` воспользуйтесь классическим подзапросом.



ничо не даст,имхо.

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

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

вообще люди связываются с партицированием не от большого ума. как правило. куча геморроя, просадка планов. замена логарифмов линейными тормозами. непонимание. нет бы таблички были по 100 гигов и более. норовят нормальные таблички похерить по моде.
...
Рейтинг: 0 / 0
вопрос по тригерам (INSTEAD + AFTER)
    #39319997
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushkaqwwq,
вроде добился промежуточного результата: и гибернейт не ругается
и записи сохраняются и апдейтятся

только пока приятного мало: жуткие тормоза)

проверил один план
как никрути:
Код: sql
1.
select id, city_id from master_partkey where id = 33666532 limit 1 

даст одну строку: id = 33666532, city_id = 4


Код: sql
1.
select mc.* from master mc where mc.id = 33666532  and mc.city_id = 4 

обойдет только одну партицию где город = 4


но вот такой запрос, (пробовал разные варианты):
Код: sql
1.
2.
with p (select city_id from master_partkey where id = 33666532 limit 1) 
select mc.* from p inner join master mc on mc.id = p.id and mc.city_id = p.clinic_id 

идет по всем партициям-городам о_О


Код: sql
1.
2.
with p (select city_id from master_partkey where id = 33666532 limit 1) 
select mc.* from p inner join lateral (select mc.* from master mc where mc.id = p.id and mc.city_id = p.clinic_id limit 1) mc on true 

тоже лезет во все партиции

как правильно построить последний запрос, что бы при входящем указанном ИД мы сразу пошли по одному городу?

Делать в 2 запроса.
Партиция выбирается на этапа планирования.
На этапе планирование для таких запросов партицию выбрать невозможно.
Поэтому 2 запроса (сначала получит city_id потом получить нужные данные подставив явный city_id в запрос).
Зря вы в вашей схеме с партиционированим связались, у вас что таблица на полтерабайта?
Вы тут уже год по граблям ходите и вопросы на форуме задаете.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
вопрос по тригерам (INSTEAD + AFTER)
    #39320110
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

есть правда трюк (и в этом случае именно трюк а-ля "колхоз")-- объявить иммутабную (секьюрити дефайнер, думаю, чтобы кеш пользало, но в план не разворачивало --- тут надо проверять) ф--ю get_city_id(id) с телом примерно таким

Код: sql
1.
select city_id from master_partkey where id = $1 limit 1 

но при добавлении нового id надо ф--ю на всякий перегружать -- в других коннектах ошибки полезут. т.е. трюк работать будет, но накладные ни в какие ворота

смысл трюка -- иммутабное значение планировщику можно вычислить до планирования. -- профит.
...
Рейтинг: 0 / 0
вопрос по тригерам (INSTEAD + AFTER)
    #39320344
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,
а если я создам функцию f_master(_id int) возвращающую таблицу аналогичную master
и там уже будет в два запроса, первым достал город, вторым запросом достал все что по этому городу плюс ИД

а в обычных запросах везде где было использование таблицы мастер по одному ИД
подменю на f_master(id)

как можно развернуть план выполнения для такого запроса:
Код: sql
1.
select * from f_master(33666532)  as master



что бы увидеть как внутри функции отрабатывает?
...
Рейтинг: 0 / 0
вопрос по тригерам (INSTEAD + AFTER)
    #39320511
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Legushkaqwwq,
а если я создам функцию f_master(_id int) возвращающую таблицу аналогичную master
и там уже будет в два запроса, первым достал город, вторым запросом достал все что по этому городу плюс ИД

а в обычных запросах везде где было использование таблицы мастер по одному ИД
подменю на f_master(id)

как можно развернуть план выполнения для такого запроса:
Код: sql
1.
select * from f_master(33666532)  as master



что бы увидеть как внутри функции отрабатывает?

Если вы в хранимке второй запрос через execute сделаете - то будет работать как вам нужно.
Если не сделаете - не будет.


--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
вопрос по тригерам (INSTEAD + AFTER)
    #39320589
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk

Если вы в хранимке второй запрос через execute сделаете - то будет работать как вам нужно.
Если не сделаете - не будет.


--
Maxim Boguk
www.postgresql-consulting.ru
тут уже можно собственноручно откейсится по партициям
, если конечно партицирование статичное.

(если динамичное -- то существубщую часть откейсить а несуществубщую -- сунуть в else execute, если конечно жопп а-ля партман (что--то там было) по регенерации кейсов не пилить (или в той же динамике ф--ю не перегружать).
...
Рейтинг: 0 / 0
вопрос по тригерам (INSTEAD + AFTER)
    #39320957
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukЕсли вы в хранимке второй запрос через execute сделаете - то будет работать как вам нужно.спасибо:)
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / вопрос по тригерам (INSTEAD + AFTER)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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