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

start [/forum/topic.php?fid=53&fpage=102&tid=1997663]: |
0ms |
get settings: |
12ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 242ms |
| total: | 389ms |

| 0 / 0 |
