Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
вопрос по тригерам (INSTEAD + AFTER)
|
|||
|---|---|---|---|
|
#18+
Всем бобра Подскажите плиз: если в случае insert создано правило instead, где мы подменили операцию insert вставкой в другую таблицу (наследованную от главной) (таким образом пришлось обходить ошибку hypernate) как можно запустить, после выполнения операции instead, еще тригеры, которые были назначены на AFTER? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2016, 15:26 |
|
||
|
вопрос по тригерам (INSTEAD + AFTER)
|
|||
|---|---|---|---|
|
#18+
LegushkaВсем бобра Подскажите плиз: если в случае insert создано правило instead, где мы подменили операцию insert вставкой в другую таблицу (наследованную от главной) (таким образом пришлось обходить ошибку hypernate) как можно запустить, после выполнения операции instead, еще тригеры, которые были назначены на AFTER? Никак или всю логику after триггеров скопировать в instead of триггер. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2016, 15:52 |
|
||
|
вопрос по тригерам (INSTEAD + AFTER)
|
|||
|---|---|---|---|
|
#18+
извините сразу сглупил: я же вставляю в наследуемую таблицу. и там надо создать все эти тригеры before/after как на мастер таблице должно получится красивое решение) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2016, 16:00 |
|
||
|
вопрос по тригерам (INSTEAD + AFTER)
|
|||
|---|---|---|---|
|
#18+
Legushkaизвините сразу сглупил: я же вставляю в наследуемую таблицу. и там надо создать все эти тригеры before/after как на мастер таблице должно получится красивое решение) ничего красивого в таком хенджобе нет. рутина. т.е. вы в старой своей задаче предка подменили вьюхой, на неё повесили инстеад в партиции, а теперь хотите взад ваши триггера, которые в прошлый раз сетом переменой в replika пробрасывали ? или только некоторые ? тогда вам возможно надо бы двойной мастернинг. чтобы инсерт триггера не множить. а все delete/update -- в любом случае на конечных партициях должны болтаться -- в предке этих событий не происходит. или это другой случай ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2016, 16:29 |
|
||
|
вопрос по тригерам (INSTEAD + AFTER)
|
|||
|---|---|---|---|
|
#18+
qwwq, почему так сделано, причина и способы решения были здесь: http://stackoverflow.com/questions/83093/hibernate-insert-batch-with-partitioned-postgresql а главная причина почему это не совсем обычное партицирование: на мастер таблицу изначально около того 50 внешних FK с каскадами и без, на любой вкус, причем на одном филиале их 30 на другом их 60 и филиалов докучи, на те таблицы в свою очередь еще вереница FK, и таких итераций много (и есть ограничение: нельзя наследовать если есть внешние FK) решение хоть и спорное: сохранить функционал внешних FK , абстрагироваться от управления этой вереницы, оставить как есть и остановится на поддержке квадратных колес и костылей одной мастер таблицы (которую надо партицировать), вот сюда и решено добавить новых тригеров чеков и подмены функции вставки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2016, 17:37 |
|
||
|
вопрос по тригерам (INSTEAD + AFTER)
|
|||
|---|---|---|---|
|
#18+
Legushka, а , ещё один способ получить непустой returning. причем в before партицировании. занятно снкс. надо куда--нть прикрутить при случае. я знаю, как напрямую -- в after, но там накладной постфактумный delete from only master никому не нравится, поэтому обычно обходятся без ретурнинга. пс про кучу фк на партицированной табле не понял. у вас что, центр звезды ведётся, или вы все подчиненки партицируете по тому же принципу ? (а множественных ссылей нет) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2016, 18:33 |
|
||
|
вопрос по тригерам (INSTEAD + AFTER)
|
|||
|---|---|---|---|
|
#18+
qwwq, вроде добился промежуточного результата: и гибернейт не ругается и записи сохраняются и апдейтятся только пока приятного мало: жуткие тормоза) проверил один план как никрути: Код: sql 1. даст одну строку: id = 33666532, city_id = 4 Код: sql 1. обойдет только одну партицию где город = 4 но вот такой запрос, (пробовал разные варианты): Код: sql 1. 2. идет по всем партициям-городам о_О Код: sql 1. 2. тоже лезет во все партиции как правильно построить последний запрос, что бы при входящем указанном ИД мы сразу пошли по одному городу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2016, 19:31 |
|
||
|
вопрос по тригерам (INSTEAD + AFTER)
|
|||
|---|---|---|---|
|
#18+
Legushka, Вместо `WITH` воспользуйтесь классическим подзапросом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2016, 19:49 |
|
||
|
вопрос по тригерам (INSTEAD + AFTER)
|
|||
|---|---|---|---|
|
#18+
vyegorovLegushka, Вместо `WITH` воспользуйтесь классическим подзапросом. ?ы ничо не даст,имхо. тс борется за то, чтобы партиционные констрейнты были поюзаны планировщиком, а определить данные, на основе которых можно исчислить констрент хочет только в самом запросе. так планировщик пж не работает. вы уж сначала возьмите ид одним запросом, а только потом -- подставьте их во второй. тогда планировщик поюзает констрейнт. а ужимки , для навязывания индекс--сиков тут не пришейкобылехвост. вообще люди связываются с партицированием не от большого ума. как правило. куча геморроя, просадка планов. замена логарифмов линейными тормозами. непонимание. нет бы таблички были по 100 гигов и более. норовят нормальные таблички похерить по моде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2016, 20:21 |
|
||
|
вопрос по тригерам (INSTEAD + AFTER)
|
|||
|---|---|---|---|
|
#18+
Legushkaqwwq, вроде добился промежуточного результата: и гибернейт не ругается и записи сохраняются и апдейтятся только пока приятного мало: жуткие тормоза) проверил один план как никрути: Код: sql 1. даст одну строку: id = 33666532, city_id = 4 Код: sql 1. обойдет только одну партицию где город = 4 но вот такой запрос, (пробовал разные варианты): Код: sql 1. 2. идет по всем партициям-городам о_О Код: sql 1. 2. тоже лезет во все партиции как правильно построить последний запрос, что бы при входящем указанном ИД мы сразу пошли по одному городу? Делать в 2 запроса. Партиция выбирается на этапа планирования. На этапе планирование для таких запросов партицию выбрать невозможно. Поэтому 2 запроса (сначала получит city_id потом получить нужные данные подставив явный city_id в запрос). Зря вы в вашей схеме с партиционированим связались, у вас что таблица на полтерабайта? Вы тут уже год по граблям ходите и вопросы на форуме задаете. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 05:56 |
|
||
|
вопрос по тригерам (INSTEAD + AFTER)
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, есть правда трюк (и в этом случае именно трюк а-ля "колхоз")-- объявить иммутабную (секьюрити дефайнер, думаю, чтобы кеш пользало, но в план не разворачивало --- тут надо проверять) ф--ю get_city_id(id) с телом примерно таким Код: sql 1. но при добавлении нового id надо ф--ю на всякий перегружать -- в других коннектах ошибки полезут. т.е. трюк работать будет, но накладные ни в какие ворота смысл трюка -- иммутабное значение планировщику можно вычислить до планирования. -- профит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 10:29 |
|
||
|
вопрос по тригерам (INSTEAD + AFTER)
|
|||
|---|---|---|---|
|
#18+
qwwq, а если я создам функцию f_master(_id int) возвращающую таблицу аналогичную master и там уже будет в два запроса, первым достал город, вторым запросом достал все что по этому городу плюс ИД а в обычных запросах везде где было использование таблицы мастер по одному ИД подменю на f_master(id) как можно развернуть план выполнения для такого запроса: Код: sql 1. что бы увидеть как внутри функции отрабатывает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 15:30 |
|
||
|
вопрос по тригерам (INSTEAD + AFTER)
|
|||
|---|---|---|---|
|
#18+
Legushkaqwwq, а если я создам функцию f_master(_id int) возвращающую таблицу аналогичную master и там уже будет в два запроса, первым достал город, вторым запросом достал все что по этому городу плюс ИД а в обычных запросах везде где было использование таблицы мастер по одному ИД подменю на f_master(id) как можно развернуть план выполнения для такого запроса: Код: sql 1. что бы увидеть как внутри функции отрабатывает? Если вы в хранимке второй запрос через execute сделаете - то будет работать как вам нужно. Если не сделаете - не будет. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 18:18 |
|
||
|
вопрос по тригерам (INSTEAD + AFTER)
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk Если вы в хранимке второй запрос через execute сделаете - то будет работать как вам нужно. Если не сделаете - не будет. -- Maxim Boguk www.postgresql-consulting.ru тут уже можно собственноручно откейсится по партициям , если конечно партицирование статичное. (если динамичное -- то существубщую часть откейсить а несуществубщую -- сунуть в else execute, если конечно жопп а-ля партман (что--то там было) по регенерации кейсов не пилить (или в той же динамике ф--ю не перегружать). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 21:22 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=85&tid=1996969]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
| others: | 268ms |
| total: | 400ms |

| 0 / 0 |
