|
|
|
SQL-состояние или сколько строк вернул insert
|
|||
|---|---|---|---|
|
#18+
Делаю insert через тригерную функцию. Всегда вставляется по 1 строке в данную таблицу. В функции прописано return null. Она и возвращает, что 0 строк вставлено. Приложение удивляется, делает Rollback. Вопрос. Как мне вернуть из тригерной функции sql-состояние? Return 1 не работает, требует именно сложного типа "SQL-состояние". Можно фиксированное прописать, но лучше всё-таки определять после insert-а внутри функции, сколько именно строк было вставлено. М.б. есть что-то типа insert ... returning SQL_state? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2016, 18:41 |
|
||
|
SQL-состояние или сколько строк вернул insert
|
|||
|---|---|---|---|
|
#18+
Если надо найти количество измененных записей, то можно сделать вот так: 1) UPDATE table GET DIAGNOSTICS l_count = ROW_COUNT RETURN l_count 2) with upd as ( UPDATE table ... RETURNING 1 ) Select count(*) into l_count from upd; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 08:24 |
|
||
|
SQL-состояние или сколько строк вернул insert
|
|||
|---|---|---|---|
|
#18+
Sergei.Agalakov, Триггерная функция не может вернуть кол-во записей. Она должна возвращать NEW если запись подлежит изменениям (для BEFORE FOR EACH ROW триггеров) либо же NULL, если изменения должны быть игнорированы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 10:10 |
|
||
|
SQL-состояние или сколько строк вернул insert
|
|||
|---|---|---|---|
|
#18+
ClonCD, Вы партиционируете? Один из подходов: - в BEFORE триггере перенаправлять данные в нужные партиции и возвращать NEW . (это будет создавать дубликаты в мастер-таблице) - дополнительно вешается AFTER триггер, который удаляет запись только из мастер таблицы (DELETE FROM ONLY), возвращая удаленную запись. Желательно чтобы на таблице был ключ — для простоты удалений. Также нужно сделать агрессивным autovacuum для мастер таблицы, чтобы не пухла. Вот один из примеров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 10:17 |
|
||
|
SQL-состояние или сколько строк вернул insert
|
|||
|---|---|---|---|
|
#18+
vyegorov, Да, партиционируем :) Спасибо за разъяснения и пример. А как насчёт создания view поверх главной таблицы и использования instead of insert? Всё-таки один триггер вместо двух, да и лишний раз в главную таблицу не лезть. Кажется, работает. Вам на практике не приходилось сталкиваться, с какого числа строк лучше партиционировать? Потому что на тестовом сервере с 50 млн. записей никакого выигрыша не наблюдаю, только накладные расходы при вставке. Агрегатные функции быстрее не работают, потому что пока нет параллельного чтения из партиций (хоть и обещают в 9.6), вывод небольшого числа строк из одной-двух партиций работает даже чуть медленнее, чем поиск по индексу в единой таблице. В реальной базе будет в районе 1 млрд строк, но там и аппаратные мощности выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 12:14 |
|
||
|
SQL-состояние или сколько строк вернул insert
|
|||
|---|---|---|---|
|
#18+
ClonCD, На практике это больше привязано к размеру таблиц, а не к записям. Если таблица до 100Гб, то я бы вообще не заморачивался партициями, а более детально смотрел бы на индексы, особенно на частичные и/или покрывающие. Также можно подумать о партициях, когда необходимо регулярное архивирование данных (скажем, по закону) — удаление большого куска данных очень долго и проще оперировать партициями. И всё равно — делаю квартальные или годовые партиции, чтоб не проигрывать в планировании запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 13:07 |
|
||
|
|

start [/forum/topic.php?fid=53&tid=1997487]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
393ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
| others: | 207ms |
| total: | 716ms |

| 0 / 0 |
