powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SQL-состояние или сколько строк вернул insert
6 сообщений из 6, страница 1 из 1
SQL-состояние или сколько строк вернул insert
    #39157837
ClonCD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делаю insert через тригерную функцию. Всегда вставляется по 1 строке в данную таблицу.
В функции прописано return null.
Она и возвращает, что 0 строк вставлено. Приложение удивляется, делает Rollback.
Вопрос. Как мне вернуть из тригерной функции sql-состояние? Return 1 не работает, требует именно сложного типа "SQL-состояние".
Можно фиксированное прописать, но лучше всё-таки определять после insert-а внутри функции, сколько именно строк было вставлено.
М.б. есть что-то типа insert ... returning SQL_state?
...
Рейтинг: 0 / 0
SQL-состояние или сколько строк вернул insert
    #39158150
Sergei.Agalakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если надо найти количество измененных записей, то можно сделать вот так:

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;
...
Рейтинг: 0 / 0
SQL-состояние или сколько строк вернул insert
    #39158248
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergei.Agalakov,

Триггерная функция не может вернуть кол-во записей. Она должна возвращать NEW если запись подлежит изменениям (для BEFORE FOR EACH ROW триггеров) либо же NULL, если изменения должны быть игнорированы.
...
Рейтинг: 0 / 0
SQL-состояние или сколько строк вернул insert
    #39158261
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ClonCD,

Вы партиционируете?

Один из подходов:
- в BEFORE триггере перенаправлять данные в нужные партиции и возвращать NEW .
(это будет создавать дубликаты в мастер-таблице)
- дополнительно вешается AFTER триггер, который удаляет запись только из мастер таблицы (DELETE FROM ONLY),
возвращая удаленную запись.

Желательно чтобы на таблице был ключ — для простоты удалений.
Также нужно сделать агрессивным autovacuum для мастер таблицы, чтобы не пухла.

Вот один из примеров.
...
Рейтинг: 0 / 0
SQL-состояние или сколько строк вернул insert
    #39158378
ClonCD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,

Да, партиционируем :)
Спасибо за разъяснения и пример.

А как насчёт создания view поверх главной таблицы и использования instead of insert? Всё-таки один триггер вместо двух, да и лишний раз в главную таблицу не лезть.
Кажется, работает.

Вам на практике не приходилось сталкиваться, с какого числа строк лучше партиционировать? Потому что на тестовом сервере с 50 млн. записей никакого выигрыша не наблюдаю, только накладные расходы при вставке. Агрегатные функции быстрее не работают, потому что пока нет параллельного чтения из партиций (хоть и обещают в 9.6), вывод небольшого числа строк из одной-двух партиций работает даже чуть медленнее, чем поиск по индексу в единой таблице.
В реальной базе будет в районе 1 млрд строк, но там и аппаратные мощности выше.
...
Рейтинг: 0 / 0
SQL-состояние или сколько строк вернул insert
    #39158423
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ClonCD,

На практике это больше привязано к размеру таблиц, а не к записям.

Если таблица до 100Гб, то я бы вообще не заморачивался партициями, а более детально смотрел бы на индексы, особенно на частичные и/или покрывающие.

Также можно подумать о партициях, когда необходимо регулярное архивирование данных (скажем, по закону) — удаление большого куска данных очень долго и проще оперировать партициями. И всё равно — делаю квартальные или годовые партиции, чтоб не проигрывать в планировании запросов.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SQL-состояние или сколько строк вернул insert
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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