Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Temporary tables в функциях / 13 сообщений из 13, страница 1 из 1
19.08.2016, 11:54
    #39294490
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Temporary tables в функциях
Как работать с временными таблицами в функциях?

надо ли удалять перед созданием?
DROP TABLE IF EXISTS table1;

Не будет ли конфликтов, если функция будет вызвана одновременно?
...
Рейтинг: 0 / 0
19.08.2016, 12:08
    #39294500
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Temporary tables в функциях
Временные таблицы (create temporary table) существуют только в пределах сессии (или даже только в пределах транзакции, если объявлены как ON COMMIT DROP). Поэтому параллельный вызов двух хранимок невозможен вообще никак.

Надо ли удалять - зависит от общего workflow. Мы же не знаем, зачем вам вообще понадобилась временная таблица.
...
Рейтинг: 0 / 0
19.08.2016, 12:47
    #39294529
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Temporary tables в функциях
MelkijВременные таблицы (create temporary table) существуют только в пределах сессии (или даже только в пределах транзакции, если объявлены как ON COMMIT DROP). Поэтому параллельный вызов двух хранимок невозможен вообще никак.

Надо ли удалять - зависит от общего workflow. Мы же не знаем, зачем вам вообще понадобилась временная таблица.

Она нужна временно только в пределах функции.
То есть, если я создам ее

begin
create table xxx .... ON COMMIT DROP;
end;

то проблем не будет
...
Рейтинг: 0 / 0
19.08.2016, 13:30
    #39294566
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Temporary tables в функциях
Ролг ХупинMelkijВременные таблицы (create temporary table) существуют только в пределах сессии (или даже только в пределах транзакции, если объявлены как ON COMMIT DROP). Поэтому параллельный вызов двух хранимок невозможен вообще никак.

Надо ли удалять - зависит от общего workflow. Мы же не знаем, зачем вам вообще понадобилась временная таблица.

Она нужна временно только в пределах функции.
То есть, если я создам ее

begin
create table xxx .... ON COMMIT DROP;
end;

то проблем не будет

проблем не будет
но не советую злоупотреблять временными таблицами без серьезного повода, очень дорогая штука для базы
(в том смысле что если хранимка вызывается 100 раз в секунду то не надо в ней временные таблицы использовать, это к проблемам с системными каталогами).
...
Рейтинг: 0 / 0
19.08.2016, 13:49
    #39294586
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Temporary tables в функциях
Maxim BogukРолг Хупинпропущено...


Она нужна временно только в пределах функции.
То есть, если я создам ее

begin
create table xxx .... ON COMMIT DROP;
end;

то проблем не будет

проблем не будет
но не советую злоупотреблять временными таблицами без серьезного повода, очень дорогая штука для базы
(в том смысле что если хранимка вызывается 100 раз в секунду то не надо в ней временные таблицы использовать, это к проблемам с системными каталогами).

эта функция не 100 раз в секунду, но надо будет подумать как избежать.
При этом я знаю, что в эту таблицу может быть вставлено не больше 1000 записей.

Вот, если бы было что-то типа таблиц-переменных как в SQL Server
...
Рейтинг: 0 / 0
19.08.2016, 14:08
    #39294609
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Temporary tables в функциях
Ролг ХупинMaxim Bogukпропущено...


проблем не будет
но не советую злоупотреблять временными таблицами без серьезного повода, очень дорогая штука для базы
(в том смысле что если хранимка вызывается 100 раз в секунду то не надо в ней временные таблицы использовать, это к проблемам с системными каталогами).

эта функция не 100 раз в секунду, но надо будет подумать как избежать.
При этом я знаю, что в эту таблицу может быть вставлено не больше 1000 записей.

Вот, если бы было что-то типа таблиц-переменных как в SQL Server]

Если очень надо можно array of records всегда сделать да (и будет вам почти таблица-переменная).
Но вообще в readonly задачах временные таблицы не нужны в 99.9% случаев, а RW обычно не очень часто вызываются.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
20.08.2016, 08:10
    #39294859
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Temporary tables в функциях
Maxim Boguk
Если очень надо можно array of records всегда сделать да (и будет вам почти таблица-переменная).
Но вообще в readonly задачах временные таблицы не нужны в 99.9% случаев, а RW обычно не очень часто вызываются.
www.postgresql-consulting.ru

Как с массивом работать?
С ним же нельзя работать как с таблицей, выборки делать и т.п.
...
Рейтинг: 0 / 0
20.08.2016, 08:12
    #39294860
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Temporary tables в функциях
Еще вопрос:

когда могут быть полезны

ON COMMIT DELETE ROWS;
ON COMMIT PRESERVE ROWS;

?

Я так понимаю, что таблица живёт в клиентской сессии, а в ней можеть быть несколько транзакций, и таким образом можно использовать темп таблицу в разных транзакциях, функциях и т.д. и передавать данные (ON COMMIT PRESERVE ROWS)

А еще?
...
Рейтинг: 0 / 0
20.08.2016, 09:27
    #39294865
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Temporary tables в функциях
Ролг ХупинMaxim Boguk Если очень надо можно array of records всегда сделать да (и будет вам почти таблица-переменная).
Но вообще в readonly задачах временные таблицы не нужны в 99.9% случаев, а RW обычно не очень часто вызываются.
www.postgresql-consulting.ru

Как с массивом работать?
С ним же нельзя работать как с таблицей, выборки делать и т.п.

Магическая функция unnest поможет с этой проблемой.
https://www.postgresql.org/docs/9.5/static/functions-array.html

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
20.08.2016, 09:36
    #39294868
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Temporary tables в функциях
Ролг ХупинЕще вопрос:

когда могут быть полезны

ON COMMIT DELETE ROWS;
ON COMMIT PRESERVE ROWS;

?

Я так понимаю, что таблица живёт в клиентской сессии, а в ней можеть быть несколько транзакций, и таким образом можно использовать темп таблицу в разных транзакциях, функциях и т.д. и передавать данные (ON COMMIT PRESERVE ROWS)

А еще?

Еще при работе через pgbouncer бывает нужно когда временную таблицу создают в начале сессии средствами pgbouncer и далее она существует все это время с delete rows on commit и не надо в транзакциях и хранимках париться и ее создавать (она просто всегда уже создана с нужной структурой заранее).
Или даже без pgbouncer приложение при коннекте создает времянку и далее с ней работает не создавая ее заново на каждый чих.

Такие времянки сииильно дешевле для базы чем те что постоянно создаются и дропаются и их можно использовать с 1000tps блоках.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
26.08.2016, 10:14
    #39298415
g2099599
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Temporary tables в функциях
Maxim BogukТакие времянки сииильно дешевле для базы чем те что постоянно создаются и дропаются и их можно использовать с 1000tps блоках.

Только вот TRUNCATE этих времянок не сильно дешев.
...
Рейтинг: 0 / 0
26.08.2016, 10:27
    #39298424
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Temporary tables в функциях
g2099599Maxim BogukТакие времянки сииильно дешевле для базы чем те что постоянно создаются и дропаются и их можно использовать с 1000tps блоках.

Только вот TRUNCATE этих времянок не сильно дешев.

Сильно дешевле чем on commit drop с распуханием pg_catalog неконтролируемым.
PS: а почему вы считаете что truncate временных таблиц дорогой? Они же не в shared buffers живут и не требуют их сканирования при truncate.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
31.08.2016, 15:49
    #39301237
Author the new one
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Temporary tables в функциях
Maxim BogukСильно дешевле чем on commit drop с распуханием pg_catalog неконтролируемым.
PS: а почему вы считаете что truncate временных таблиц дорогой? Они же не в shared buffers живут и не требуют их сканирования при truncate.

Потому что сервер должен слазить в ФС и создать новый файл для таблицы.

Отдельно обращу внимание на https://github.com/postgrespro/pg_variables , во многих случаях удобнее и без оверхеда со временными таблицами.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Temporary tables в функциях / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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