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

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

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

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

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

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

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

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

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

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

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

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

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


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