Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Какие подводные камни есть при работе с временными таблицами?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Здравствуйте!
Подскажите плиз - какие подводные камни могут быть при использовании временных таблиц? Раньше работала с временными таблицами в оракле, но отличий тут очень много. Доку читала, но боюсь что-то упустить.

1) Предположим, есть метод 1 некоего приложения (не хранимые процедуры sql), создающие временную таблицу и наполняющие ее. 2) Далее в этой же сессии, но в методе 2 внешнего приложения, метод 1 заполнения временной таблицы вызывается несколько раз - то есть таблица чистится и перезаполняется в одной сессии несколько раз. Временная таблица после заполнения используется в запросах в той же сессии в методе 2.
3) Предположим, есть Х пользователей, которые одновременно вызывают метод 2 (это метод формирования отчета, хотя в общем-то неважно что это :)).
Вопросы:

1) Я так понимаю, что как и в оракле, данные пишутся в темп. В какой момент они физически очистятся? Если отчет будут вызывать часто (но каждый раз удалять старые записи в временной таблице) - не переполнится ли темп? Или они будут удаляться сразу же?
2) Момент создания таблиц и конкурентный доступ - как с ними? Я так поняла, что таблица должна быть создана в начале сессии каждого пользователя. И что другой пользователь не увидит таблицу вообще, если ее не создали в начале сессии.
3) Какие вообще подводные камни есть? На что обращать внимание?
5 июн 11, 22:03    [10765979]     Ответить | Цитировать Сообщить модератору
 Re: Какие подводные камни есть при работе с временными таблицами?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Kateryne
1) В какой момент они физически очистятся?
При удалении данных, удалении таблиц или при закрытии сессии.
Kateryne
2) Я так поняла, что таблица должна быть создана в начале сессии каждого пользователя. И что другой пользователь не увидит таблицу вообще, если ее не создали в начале сессии.
Не обязательно вначале. Другие не увидят.
Kateryne
3) Какие вообще подводные камни есть? На что обращать внимание?
Все запросы, использующие верменную таблицу будут перекомпилироваться. Для отчётов это даже хорошо, ждя OLTP не очень.

Всё вышесказанное относится к локальным временным таблицам.
5 июн 11, 22:28    [10766092]     Ответить | Цитировать Сообщить модератору
 Re: Какие подводные камни есть при работе с временными таблицами?  [new]
Гришков Максим
Member

Откуда: СПб
Сообщений: 324
Kateryne, такой вот вопрос я поднимал не так уж давно. В MS SQL временные таблицы - совсем не то, что в оракле.
5 июн 11, 22:35    [10766113]     Ответить | Цитировать Сообщить модератору
 Re: Какие подводные камни есть при работе с временными таблицами?  [new]
aleks2
Guest
Kateryne
На что обращать внимание?

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

Либо уж сваяйте постоянную, либо дайте каждому по персональной времянке. И не парьтесь
6 июн 11, 07:24    [10766979]     Ответить | Цитировать Сообщить модератору
 Re: Какие подводные камни есть при работе с временными таблицами?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
aleks2
Особое внимание обратить на медитацию по теме: а нафега козе баян? Ну, т.е. МНОЖЕСТВУ пользователей ОДНА временная таблица?
Как я понял, ТС как раз требуется кажлому пользователю свою временную таблицу.
6 июн 11, 08:53    [10767111]     Ответить | Цитировать Сообщить модератору
 Re: Какие подводные камни есть при работе с временными таблицами?  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
alexeyvg
aleks2
Особое внимание обратить на медитацию по теме: а нафега козе баян? Ну, т.е. МНОЖЕСТВУ пользователей ОДНА временная таблица?
Как я понял, ТС как раз требуется кажлому пользователю свою временную таблицу.
Как раз скорее всего непонятно... ТС просто просит рассказать об временных таблицах... А на самом деле лучше бы рассказал, что надо??? М.б. и без временных таблиц обойтись можно... А может и нет...
6 июн 11, 09:06    [10767163]     Ответить | Цитировать Сообщить модератору
 Re: Какие подводные камни есть при работе с временными таблицами?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Владимир СА
... М.б. и без временных таблиц обойтись можно...
Да там вообще может от многого чего отказаться, отличия не малые.
А вааще временных таблиц 4-ре вида (2-ва вида табличных переменных, 2-ва - темповых).
6 июн 11, 10:16    [10767546]     Ответить | Цитировать Сообщить модератору
 Re: Какие подводные камни есть при работе с временными таблицами?  [new]
Orus
Member

Откуда:
Сообщений: 28
aleks2 пишет
" Особое внимание обратить на медитацию по теме: а нафега козе баян? Ну, т.е. МНОЖЕСТВУ пользователей ОДНА временная таблица?"
вот и я столкнулась с аналогичной проблемой. Данные готовятся в хранимой процедуре во временной таблице, клиент.приложение их правит, изменяет и т.д., затем хранимая процедура их обрабатывает. По такой схеме приложение работает с базами oracle, postgresql. я надеялась что также будет и с ms sql. но ..
создаю таблицу ##temptable в процедуре. и она становится доступна ВСЕМ сессиям. Так действительно - нафига такая временная таблица?.. Хотя возможно я что то не так делаю... с ms sql только начинаю разбираться. Если использовать локальные временные таблицы - то они доступны только в процедуре... Наверно придется добавлять sessionid во временную таблицу..
6 июн 11, 10:16    [10767550]     Ответить | Цитировать Сообщить модератору
 Re: Какие подводные камни есть при работе с временными таблицами?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Orus
Если использовать локальные временные таблицы - то они доступны только в процедуре...

В статье create table прочитайте про область видимости и время жизни временных таблиц
Все, что создано внутри процедуры, уничтожается при ее окончании
А все, что создано до нее, продолжает существовать
6 июн 11, 10:24    [10767590]     Ответить | Цитировать Сообщить модератору
 Re: Какие подводные камни есть при работе с временными таблицами?  [new]
aleks2
Guest
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 заколбасить.
6 июн 11, 10:30    [10767643]     Ответить | Цитировать Сообщить модератору
 Re: Какие подводные камни есть при работе с временными таблицами?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Orus,
1. приложение создает #таблицу (не в процедуре)
2. процедура наполняет
3. приложение изменяет
4. процедура обрабатывает
5. сессия заканчивается и таблица пропадает бесследно или приложение явно её удаляет (или процедура в пункте 4)
6. PROFIT

Но подход навязанный oracle, postgresql и другими недо-системами можно выкинуть и написать по человечески:

1. приложение получает данные из функции/запроса
2. приложение изменяет данные
3. приложение передаёт данные процедуре, которая их "применяет"
4. PROFIT

И при этом сессии могут быть разные, не нужно держать connect (особенно с 3х-звенкой). Не говоря о большей гибкости.
Передать данные в процедуру можно и через табличные параметры.
6 июн 11, 10:43    [10767765]     Ответить | Цитировать Сообщить модератору
 Re: Какие подводные камни есть при работе с временными таблицами?  [new]
Orus
Member

Откуда:
Сообщений: 28
Mnior
Orus,
1. приложение создает #таблицу (не в процедуре)
2. процедура наполняет
3. приложение изменяет
4. процедура обрабатывает
5. сессия заканчивается и таблица пропадает бесследно или приложение явно её удаляет (или процедура в пункте 4)
6. PROFIT


похоже разобралась - действительно локальная #таблица - ведет себя нормально. проблема в компонентах - приложение на delphi изначально писалось для Postgresql с использованием компонентов Zeos. если работать напрямую через ADO - то все нормально- первый вариант отрабатывает. а вот с zeos через ado - проблемы.
zConn.Connected:=True;
qry.close;
qry.SQL.text:='create table #tmptable (col1 int, col2 int)';
qry.ExecSQL;
qry.Close;
qry.SQL.Text:='select * from #tmptable ';
qry.open; // ошибка - не видит таблицы.
но это уже другая история для форума delphi. К сожалению "коней на переправе не меняют" и переписывать приложение на новые компоненты времени нет. придется извращаться
6 июн 11, 11:37    [10768353]     Ответить | Цитировать Сообщить модератору
 Re: Какие подводные камни есть при работе с временными таблицами?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Временная таблица нужна мне, так как:
1) есть довольно сложный запрос, джойнящий несколько таблиц да еще со всякими case, group by, top итп... Он преобразует данные в универсальном хранилище вида "Объект, Тип параметра, значение параметра, дата изменения параметра" в таблицу вида "Объект, Параметр 1, Параметр 2..." Структура приведена упрощенно, но принцип такой
В запрос передаются разные условия фильтрации - дата, фильтр по полям, так что в результате мы имеем разные данные для разных условий
2) есть куча отчетов, которые формируются путем джойна полученной в п.1 таблицы с еще парой таблиц. Джойны каждый раз разные, но то что в запросе используется таблица из п.1 - во всех отчетах есть.
3) соответственно, временными таблицами мы хотим добиться того, чтобы код формирования таблицы из п.1 был в одном месте описан, а не в каждом отчете повторялся. Это с одной стороны. И с другой стороны - так как таблица джойнится с другими - мы полагаем, что джойн с физической временной таблицей, проиндексированной по полю связи, будет быстрее чем джойн со сложным запросом.
6 июн 11, 11:37    [10768356]     Ответить | Цитировать Сообщить модератору
 Re: Какие подводные камни есть при работе с временными таблицами?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Kateryne
запрос, джойнящий несколько таблиц да еще со всякими case, group by, top итп...
Как страшно жить.
Kateryne
в универсальном ...
Pivot?
Kateryne
куча отчетов, ... используется таблица из п.1 ...
код формирования таблицы из п.1 был в одном месте описан
А для чего тогда VIEW/FUNCTION (параметризованные представления или функциональные процедуры)?
Kateryne
проиндексированной по полю связи, будет быстрее чем джойн со сложным запросом.
Это верно (могли бы написать в сразу в 2х словах).
Хотя есть многое чего другого (включая индексированные представления). На практике подготовка данных заранее может быть более эффективно, чем подготовка их каждый раз и снова по запросу пользователя.
В добавок если рассматривать PIVOT, то мало что даст, и в добавок чувствуется запашок "универсального монстра" - наворотили схему, а потом извращаетесь такими запросами.
6 июн 11, 12:20    [10768739]     Ответить | Цитировать Сообщить модератору
 Re: Какие подводные камни есть при работе с временными таблицами?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Это не pivot, совсем другое. Универсальная периодика по снимку на момент времени.
То есть есть объект - ну например договор. У договора есть объект услуга. У услуги есть произвольный набор характеристик, изменяемый во времени. Например - прайс-лист сегодня по договору один, потом делают допсоглашение и он уже другой. Таких параметров может быть много - прайс-лист, срок отсрочки платежа итп... Причем еще и параметры могут задним числом меняться.
Но на момент времени у объекта есть только один действующий параметр.

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

Мне кажется, что для такой схемы временная таблица лучший вариант. Особенно учитывая то, что процедуры-функции - вещь чуждая для системы, ни одной нет, бизнес-логика на сервере приложений.
Но может я и ошибаюсь. Если да - что лучше посоветуете?
6 июн 11, 12:51    [10769002]     Ответить | Цитировать Сообщить модератору
 Re: Какие подводные камни есть при работе с временными таблицами?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Ну хотя да, pivot, в общем-то. Но сначала отбираются действующие параметры.
6 июн 11, 12:52    [10769016]     Ответить | Цитировать Сообщить модератору
 Re: Какие подводные камни есть при работе с временными таблицами?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Надо быть последовательными.
Выставляете как есть, а далее по желанию исследуете и разрабатывайте. Будет куда оптимизировать.
А то так за двумя зайцами.
6 июн 11, 20:21    [10773108]     Ответить | Цитировать Сообщить модератору
 Re: Какие подводные камни есть при работе с временными таблицами?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
Kateryne,
Судя по всему вместо одного расчета в постоянную таблицу будет стопиццот раз переращитываться во временные. Так?
7 июн 11, 00:48    [10773962]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить