
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
30.10.2015, 14:26
|
|||
|---|---|---|---|
Создание временных таблиц с изоляцией на уровне вызова функции |
|||
|
#18+
Есть функция, которая использует внутри себя временную таблицу. Функцию могут вызывать в рамках одной транзакции много раз. Как сделать так, что бы каждый вызов функции работал со своим экземпляром временной таблицы? Пробовал через dyanmic sql геренировать уникальное имя таблицы для каждого вызова - не получилось т.к. нужно потом из этой временной таблицы делать select в переменные. Сама функция есть здесь: http://www.sql.ru/forum/1182362/fias-funkciya-ili-predstavlenie-dannyh ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.10.2015, 16:29
|
|||
|---|---|---|---|
Создание временных таблиц с изоляцией на уровне вызова функции |
|||
|
#18+
YurikGL, А какие у вас проблемы? именно так и должно всё быть (каждый вызов функции работает со своим экземпляром) делайте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.10.2015, 16:30
|
|||
|---|---|---|---|
Создание временных таблиц с изоляцией на уровне вызова функции |
|||
|
#18+
grufosYurikGL, А какие у вас проблемы? именно так и должно всё быть (каждый вызов функции работает со своим экземпляром) делайте CREATE TEMP TABLE tmp (.... ) ON COMMIT DROP; у меня именно так всё работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.10.2015, 16:33
|
|||
|---|---|---|---|
|
|||
Создание временных таблиц с изоляцией на уровне вызова функции |
|||
|
#18+
Видимо функции вложенные, раз такая проблема возникла. Я бы вообще не советовал использовать временные таблицы в функциях, которые часто вызываются. Это плохо закончится во-первых bloating'ом системного каталога, а во-вторых рано или поздно исчерпанием диапазона OIDов в pg_class. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.10.2015, 16:40
|
|||
|---|---|---|---|
Создание временных таблиц с изоляцией на уровне вызова функции |
|||
|
#18+
Нет меня, есть еще одна "проблемка".... если использовать временные таблицы, то нет возможности использовать сервер горячего резерва (ReadOnly) для вызова читающих функций. также есть ещё проблема связанная с блокировками системного каталога на моменте команды create temp table. Это просто тормозит работу и в нагруженных системах будет очень сильно мешать. По этим причинам я уже отказался от использования таких таблиц и переписал код в критичных (часто вызываемых) функциях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
31.10.2015, 12:04
|
|||
|---|---|---|---|
Создание временных таблиц с изоляцией на уровне вызова функции |
|||
|
#18+
grufosYurikGL, А какие у вас проблемы? именно так и должно всё быть (каждый вызов функции работает со своим экземпляром) делайте Пока проблем нет. Однако, если принудительно не дропать временную таблицу в функции, при повторном вызове из пгАдмин выводится ошибка, что "таблица уже существует". Из этого я сделал вывод, что второй вызов функции не изолируется от первого в части временных таблиц, раз он видит временную таблицу, созданную при предыдущем вызове. Если это так, то возможна ситуация, когда, при частом вызове функции в рамках одной транзакции, предыдущее выполнение завершиться не успеет, а новое выполнение уже начнется. В этом случае функция отработает некорректно. Нет меняВидимо функции вложенные, раз такая проблема возникла. Я бы вообще не советовал использовать временные таблицы в функциях, которые часто вызываются. Это плохо закончится во-первых bloating'ом системного каталога, а во-вторых рано или поздно исчерпанием диапазона OIDов в pg_class. Функция не вложенная. Если не временная таблица, то что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
31.10.2015, 12:16
|
|||
|---|---|---|---|
|
|||
Создание временных таблиц с изоляцией на уровне вызова функции |
|||
|
#18+
YurikGLЕсли это так, то возможна ситуация, когда, при частом вызове функции в рамках одной транзакции, предыдущее выполнение завершиться не успеет, а новое выполнение уже начнется. Такая ситуация невозможна. Почитайте в документации, что такое транзакции, сессии и временные таблицы. Дропать временную таблицу можно либо в конце функции, либо в конце транзакции, либо в конце сессии. Каждый последующий вариант предпочтительнее предыдущего. Но лучше вообще ими не пользоваться, учитывая то, как они реализованы в Постгресе (их недостатки вам уже рассказали). YurikGLЕсли не временная таблица, то что? Уберите ее вообще, сделайте один запрос и верните все данные из него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
31.10.2015, 12:36
|
|||
|---|---|---|---|
Создание временных таблиц с изоляцией на уровне вызова функции |
|||
|
#18+
Нет меняYurikGLЕсли это так, то возможна ситуация, когда, при частом вызове функции в рамках одной транзакции, предыдущее выполнение завершиться не успеет, а новое выполнение уже начнется. Такая ситуация невозможна. Почитайте в документации, что такое транзакции, сессии и временные таблицы. Дропать временную таблицу можно либо в конце функции, либо в конце транзакции, либо в конце сессии. Каждый последующий вариант предпочтительнее предыдущего. Но лучше вообще ими не пользоваться, учитывая то, как они реализованы в Постгресе (их недостатки вам уже рассказали). Вы хотите сказать, что я не смогу в двух разных потоках через одну и ту же сессию и транзакцию параллельно запустить на исполнение одну и то же функцию? Почему это? Нет меняYurikGLЕсли не временная таблица, то что? Уберите ее вообще, сделайте один запрос и верните все данные из него. В моем случае нужно данные из разных записей, которые вернул рекурсивный запрос, в итоге вернуть в виде одной записи. Простым запросом здесь не обойдешься. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
31.10.2015, 13:56
|
|||
|---|---|---|---|
Создание временных таблиц с изоляцией на уровне вызова функции |
|||
|
#18+
YurikGLСама функция естьсделай без промежуточной таблицы и не парься с тем, чем это грозит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
31.10.2015, 14:11
|
|||
|---|---|---|---|
Создание временных таблиц с изоляцией на уровне вызова функции |
|||
|
#18+
p2.YurikGLСама функция естьсделай без промежуточной таблицы и не парься с тем, чем это грозит. Как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
31.10.2015, 16:41
|
|||
|---|---|---|---|
Создание временных таблиц с изоляцией на уровне вызова функции |
|||
|
#18+
YurikGLНет меняпропущено... Такая ситуация невозможна. Почитайте в документации, что такое транзакции, сессии и временные таблицы. Дропать временную таблицу можно либо в конце функции, либо в конце транзакции, либо в конце сессии. Каждый последующий вариант предпочтительнее предыдущего. Но лучше вообще ими не пользоваться, учитывая то, как они реализованы в Постгресе (их недостатки вам уже рассказали). Вы хотите сказать, что я не смогу в двух разных потоках через одну и ту же сессию и транзакцию параллельно запустить на исполнение одну и то же функцию? Почему это? Нет меняпропущено... Уберите ее вообще, сделайте один запрос и верните все данные из него. В моем случае нужно данные из разных записей, которые вернул рекурсивный запрос, в итоге вернуть в виде одной записи. Простым запросом здесь не обойдешься. какие в жопу потоки в сессии постгреса, да ещё и в рамках, ять, транзакции. сессия - это процесс. никаких параллельных потоков в рамках транзакции не бывает по определению. (нет, я могу поднять несколько асинхронных dblink запросов [как их клиент], и они таки будут параллельны, но они будут в своих сессиях, в своих транзакциях, а не в моей). не совсем понял проблему со сворачиванием рекурсивого запроса в следующем предложении того же CTE -- с момента появления CTE без времянок можно обойтись почти всегда, и только в некоторых случаях это будет не очень очевидно или удобно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
02.11.2015, 10:08
|
|||
|---|---|---|---|
Создание временных таблиц с изоляцией на уровне вызова функции |
|||
|
#18+
qwwqкакие в жопу потоки в сессии постгреса, да ещё и в рамках, ять, транзакции. сессия - это процесс. никаких параллельных потоков в рамках транзакции не бывает по определению. (нет, я могу поднять несколько асинхронных dblink запросов [как их клиент], и они таки будут параллельны, но они будут в своих сессиях, в своих транзакциях, а не в моей). не совсем понял проблему со сворачиванием рекурсивого запроса в следующем предложении того же CTE -- с момента появления CTE без времянок можно обойтись почти всегда, и только в некоторых случаях это будет не очень очевидно или удобно. С транзакциями затупил.. все верно: клиент выстроит все равно всех в одну цепочку. По сабжу - переписал через while. По ссылке доступно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=53&mobile=1&tid=1997663]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
135ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
25ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 385ms |

| 0 / 0 |
