Kateryne
Дата: 05.06.2011 22:03:06
Здравствуйте!
Подскажите плиз - какие подводные камни могут быть при использовании временных таблиц? Раньше работала с временными таблицами в оракле, но отличий тут очень много. Доку читала, но боюсь что-то упустить.
1) Предположим, есть метод 1 некоего приложения (не хранимые процедуры sql), создающие временную таблицу и наполняющие ее. 2) Далее в этой же сессии, но в методе 2 внешнего приложения, метод 1 заполнения временной таблицы вызывается несколько раз - то есть таблица чистится и перезаполняется в одной сессии несколько раз. Временная таблица после заполнения используется в запросах в той же сессии в методе 2.
3) Предположим, есть Х пользователей, которые одновременно вызывают метод 2 (это метод формирования отчета, хотя в общем-то неважно что это :)).
Вопросы:
1) Я так понимаю, что как и в оракле, данные пишутся в темп. В какой момент они физически очистятся? Если отчет будут вызывать часто (но каждый раз удалять старые записи в временной таблице) - не переполнится ли темп? Или они будут удаляться сразу же?
2) Момент создания таблиц и конкурентный доступ - как с ними? Я так поняла, что таблица должна быть создана в начале сессии каждого пользователя. И что другой пользователь не увидит таблицу вообще, если ее не создали в начале сессии.
3) Какие вообще подводные камни есть? На что обращать внимание?
alexeyvg
Дата: 05.06.2011 22:28:30
Kateryne |
---|
1) В какой момент они физически очистятся? |
При удалении данных, удалении таблиц или при закрытии сессии.
Kateryne |
---|
2) Я так поняла, что таблица должна быть создана в начале сессии каждого пользователя. И что другой пользователь не увидит таблицу вообще, если ее не создали в начале сессии. |
Не обязательно вначале. Другие не увидят.
Kateryne |
---|
3) Какие вообще подводные камни есть? На что обращать внимание? |
Все запросы, использующие верменную таблицу будут перекомпилироваться. Для отчётов это даже хорошо, ждя OLTP не очень.
Всё вышесказанное относится к локальным временным таблицам.
Orus
Дата: 06.06.2011 10:16:33
aleks2 пишет
" Особое внимание обратить на медитацию по теме: а нафега козе баян? Ну, т.е. МНОЖЕСТВУ пользователей ОДНА временная таблица?"
вот и я столкнулась с аналогичной проблемой. Данные готовятся в хранимой процедуре во временной таблице, клиент.приложение их правит, изменяет и т.д., затем хранимая процедура их обрабатывает. По такой схеме приложение работает с базами oracle, postgresql. я надеялась что также будет и с ms sql. но ..
создаю таблицу ##temptable в процедуре. и она становится доступна ВСЕМ сессиям. Так действительно - нафига такая временная таблица?.. Хотя возможно я что то не так делаю... с ms sql только начинаю разбираться. Если использовать локальные временные таблицы - то они доступны только в процедуре... Наверно придется добавлять sessionid во временную таблицу..
Glory
Дата: 06.06.2011 10:24:10
Orus |
---|
Если использовать локальные временные таблицы - то они доступны только в процедуре... |
В статье create table прочитайте про область видимости и время жизни временных таблиц
Все, что создано внутри процедуры, уничтожается при ее окончании
А все, что создано до нее, продолжает существовать
aleks2
Дата: 06.06.2011 10:30:39
Orus |
---|
aleks2 пишет " Особое внимание обратить на медитацию по теме: а нафега козе баян? Ну, т.е. МНОЖЕСТВУ пользователей ОДНА временная таблица?" вот и я столкнулась с аналогичной проблемой. Данные готовятся в хранимой процедуре во временной таблице, клиент.приложение их правит, изменяет и т.д., затем хранимая процедура их обрабатывает. По такой схеме приложение работает с базами oracle, postgresql. я надеялась что также будет и с ms sql. но .. создаю таблицу ##temptable в процедуре. и она становится доступна ВСЕМ сессиям. Так действительно - нафига такая временная таблица?.. Хотя возможно я что то не так делаю... с ms sql только начинаю разбираться. Если использовать локальные временные таблицы - то они доступны только в процедуре... Наверно придется добавлять sessionid во временную таблицу.. |
1. Козе нужна #таблица, созданная В СЕССИИ БЕЗ/ДО всяких процедур.
2. Тока надо все ж аккуратно подумать: а нафега козе баян? Постоянная таблица с SPID&USER_ID, кластерный индекс по SPID&USER_ID, View c фильтрацией по SPID&USER_ID - оно проще и понятнее.
3. И глюки разбирать проще.
4. Опять же можна отчет ваять с перекурами хоть на неделю... но тады SPID не годится. Ну... GUID заколбасить.