powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Создание временных таблиц с изоляцией на уровне вызова функции
12 сообщений из 12, страница 1 из 1
Создание временных таблиц с изоляцией на уровне вызова функции
    #39091156
YurikGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть функция, которая использует внутри себя временную таблицу.
Функцию могут вызывать в рамках одной транзакции много раз.
Как сделать так, что бы каждый вызов функции работал со своим экземпляром временной таблицы?

Пробовал через dyanmic sql геренировать уникальное имя таблицы для каждого вызова - не получилось т.к. нужно потом из этой временной таблицы делать select в переменные.

Сама функция есть здесь: http://www.sql.ru/forum/1182362/fias-funkciya-ili-predstavlenie-dannyh
...
Рейтинг: 0 / 0
Создание временных таблиц с изоляцией на уровне вызова функции
    #39091334
Фотография grufos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YurikGL,

А какие у вас проблемы?
именно так и должно всё быть (каждый вызов функции работает со своим экземпляром)
делайте
...
Рейтинг: 0 / 0
Создание временных таблиц с изоляцией на уровне вызова функции
    #39091336
Фотография grufos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grufosYurikGL,

А какие у вас проблемы?
именно так и должно всё быть (каждый вызов функции работает со своим экземпляром)
делайте
CREATE TEMP TABLE tmp (.... ) ON COMMIT DROP;
у меня именно так всё работает.
...
Рейтинг: 0 / 0
Создание временных таблиц с изоляцией на уровне вызова функции
    #39091339
Нет меня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Видимо функции вложенные, раз такая проблема возникла.

Я бы вообще не советовал использовать временные таблицы в функциях, которые часто вызываются. Это плохо закончится во-первых bloating'ом системного каталога, а во-вторых рано или поздно исчерпанием диапазона OIDов в pg_class.
...
Рейтинг: 0 / 0
Создание временных таблиц с изоляцией на уровне вызова функции
    #39091347
Фотография grufos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет меня,

есть еще одна "проблемка"....
если использовать временные таблицы, то нет возможности использовать сервер горячего резерва (ReadOnly) для вызова читающих функций.

также есть ещё проблема связанная с блокировками системного каталога на моменте команды create temp table. Это просто тормозит работу и в нагруженных системах будет очень сильно мешать.

По этим причинам я уже отказался от использования таких таблиц и переписал код в критичных (часто вызываемых) функциях.
...
Рейтинг: 0 / 0
Создание временных таблиц с изоляцией на уровне вызова функции
    #39091681
YurikGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grufosYurikGL,

А какие у вас проблемы?
именно так и должно всё быть (каждый вызов функции работает со своим экземпляром)
делайте

Пока проблем нет. Однако, если принудительно не дропать временную таблицу в функции, при повторном вызове из пгАдмин выводится ошибка, что "таблица уже существует". Из этого я сделал вывод, что второй вызов функции не изолируется от первого в части временных таблиц, раз он видит временную таблицу, созданную при предыдущем вызове.
Если это так, то возможна ситуация, когда, при частом вызове функции в рамках одной транзакции, предыдущее выполнение завершиться не успеет, а новое выполнение уже начнется. В этом случае функция отработает некорректно.

Нет меняВидимо функции вложенные, раз такая проблема возникла.

Я бы вообще не советовал использовать временные таблицы в функциях, которые часто вызываются. Это плохо закончится во-первых bloating'ом системного каталога, а во-вторых рано или поздно исчерпанием диапазона OIDов в pg_class.
Функция не вложенная.
Если не временная таблица, то что?
...
Рейтинг: 0 / 0
Создание временных таблиц с изоляцией на уровне вызова функции
    #39091683
Нет меня
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YurikGLЕсли это так, то возможна ситуация, когда, при частом вызове функции в рамках одной транзакции, предыдущее выполнение завершиться не успеет, а новое выполнение уже начнется.
Такая ситуация невозможна. Почитайте в документации, что такое транзакции, сессии и временные таблицы. Дропать временную таблицу можно либо в конце функции, либо в конце транзакции, либо в конце сессии. Каждый последующий вариант предпочтительнее предыдущего. Но лучше вообще ими не пользоваться, учитывая то, как они реализованы в Постгресе (их недостатки вам уже рассказали).

YurikGLЕсли не временная таблица, то что?
Уберите ее вообще, сделайте один запрос и верните все данные из него.
...
Рейтинг: 0 / 0
Создание временных таблиц с изоляцией на уровне вызова функции
    #39091689
YurikGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет меняYurikGLЕсли это так, то возможна ситуация, когда, при частом вызове функции в рамках одной транзакции, предыдущее выполнение завершиться не успеет, а новое выполнение уже начнется.
Такая ситуация невозможна. Почитайте в документации, что такое транзакции, сессии и временные таблицы. Дропать временную таблицу можно либо в конце функции, либо в конце транзакции, либо в конце сессии. Каждый последующий вариант предпочтительнее предыдущего. Но лучше вообще ими не пользоваться, учитывая то, как они реализованы в Постгресе (их недостатки вам уже рассказали).
Вы хотите сказать, что я не смогу в двух разных потоках через одну и ту же сессию и транзакцию параллельно запустить на исполнение одну и то же функцию? Почему это?

Нет меняYurikGLЕсли не временная таблица, то что?
Уберите ее вообще, сделайте один запрос и верните все данные из него.
В моем случае нужно данные из разных записей, которые вернул рекурсивный запрос, в итоге вернуть в виде одной записи. Простым запросом здесь не обойдешься.
...
Рейтинг: 0 / 0
Создание временных таблиц с изоляцией на уровне вызова функции
    #39091722
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YurikGLСама функция естьсделай без промежуточной таблицы и не парься с тем, чем это грозит.
...
Рейтинг: 0 / 0
Создание временных таблиц с изоляцией на уровне вызова функции
    #39091727
YurikGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.YurikGLСама функция естьсделай без промежуточной таблицы и не парься с тем, чем это грозит.

Как?
...
Рейтинг: 0 / 0
Создание временных таблиц с изоляцией на уровне вызова функции
    #39091757
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YurikGLНет меняпропущено...

Такая ситуация невозможна. Почитайте в документации, что такое транзакции, сессии и временные таблицы. Дропать временную таблицу можно либо в конце функции, либо в конце транзакции, либо в конце сессии. Каждый последующий вариант предпочтительнее предыдущего. Но лучше вообще ими не пользоваться, учитывая то, как они реализованы в Постгресе (их недостатки вам уже рассказали).
Вы хотите сказать, что я не смогу в двух разных потоках через одну и ту же сессию и транзакцию параллельно запустить на исполнение одну и то же функцию? Почему это?

Нет меняпропущено...

Уберите ее вообще, сделайте один запрос и верните все данные из него.
В моем случае нужно данные из разных записей, которые вернул рекурсивный запрос, в итоге вернуть в виде одной записи. Простым запросом здесь не обойдешься.
какие в жопу потоки в сессии постгреса, да ещё и в рамках, ять, транзакции.
сессия - это процесс. никаких параллельных потоков в рамках транзакции не бывает по определению. (нет, я могу поднять несколько асинхронных dblink запросов [как их клиент], и они таки будут параллельны, но они будут в своих сессиях, в своих транзакциях, а не в моей).


не совсем понял проблему со сворачиванием рекурсивого запроса в следующем предложении того же CTE
-- с момента появления CTE без времянок можно обойтись почти всегда, и только в некоторых случаях это будет не очень очевидно или удобно.
...
Рейтинг: 0 / 0
Создание временных таблиц с изоляцией на уровне вызова функции
    #39092419
YurikGL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqкакие в жопу потоки в сессии постгреса, да ещё и в рамках, ять, транзакции.
сессия - это процесс. никаких параллельных потоков в рамках транзакции не бывает по определению. (нет, я могу поднять несколько асинхронных dblink запросов [как их клиент], и они таки будут параллельны, но они будут в своих сессиях, в своих транзакциях, а не в моей).


не совсем понял проблему со сворачиванием рекурсивого запроса в следующем предложении того же CTE
-- с момента появления CTE без времянок можно обойтись почти всегда, и только в некоторых случаях это будет не очень очевидно или удобно.

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


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