Какие подводные камни есть при работе с временными таблицами?

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 не очень.

Всё вышесказанное относится к локальным временным таблицам.
Гришков Максим
Дата: 05.06.2011 22:35:21
Kateryne, такой вот вопрос я поднимал не так уж давно. В MS SQL временные таблицы - совсем не то, что в оракле.
aleks2
Дата: 06.06.2011 07:24:54
Kateryne
На что обращать внимание?

Особое внимание обратить на медитацию по теме: а нафега козе баян? Ну, т.е. МНОЖЕСТВУ пользователей ОДНА временная таблица?

Либо уж сваяйте постоянную, либо дайте каждому по персональной времянке. И не парьтесь
alexeyvg
Дата: 06.06.2011 08:53:39
aleks2
Особое внимание обратить на медитацию по теме: а нафега козе баян? Ну, т.е. МНОЖЕСТВУ пользователей ОДНА временная таблица?
Как я понял, ТС как раз требуется кажлому пользователю свою временную таблицу.
Владимир СА
Дата: 06.06.2011 09:06:09
alexeyvg
aleks2
Особое внимание обратить на медитацию по теме: а нафега козе баян? Ну, т.е. МНОЖЕСТВУ пользователей ОДНА временная таблица?
Как я понял, ТС как раз требуется кажлому пользователю свою временную таблицу.
Как раз скорее всего непонятно... ТС просто просит рассказать об временных таблицах... А на самом деле лучше бы рассказал, что надо??? М.б. и без временных таблиц обойтись можно... А может и нет...
Mnior
Дата: 06.06.2011 10:16:02
Владимир СА
... М.б. и без временных таблиц обойтись можно...
Да там вообще может от многого чего отказаться, отличия не малые.
А вааще временных таблиц 4-ре вида (2-ва вида табличных переменных, 2-ва - темповых).
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 заколбасить.