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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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


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