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

SP1 вызывает другую SP2 и хочет получить кучу данных (вообще говоря, больше 8К). Стандартный подход - создать временную таблицу в SP1 и заполнить ее в SP2 - страдает серьезным недостатком - требует постоянной перекомпиляции обоих процедур.

Может быть, у кого-нибудь есть еще какие-нибудь другие идеи?
Интересует прежде всего MSSQL2000, но желательно еще иметь совместимость с SQL7...
25 мар 04, 17:53    [597669]     Ответить | Цитировать Сообщить модератору
 Re: Сакраментальный вопрос о временных таблицах  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
Только сделать вместо временой постоянную таблицу с разделением по spid.
25 мар 04, 18:24    [597759]     Ответить | Цитировать Сообщить модератору
 Re: Сакраментальный вопрос о временных таблицах  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Стандартный подход - вернуть открытый статик курсор :)
Или резалт-сет , который вызывающая примет во временную таблицу
25 мар 04, 18:52    [597830]     Ответить | Цитировать Сообщить модератору
 Re: Сакраментальный вопрос о временных таблицах  [new]
gggguest
Guest
2 Crimean:

Курсор - это шутка?

А result set - это типа INSERT INTO #T EXEC SP2?
25 мар 04, 19:30    [597901]     Ответить | Цитировать Сообщить модератору
 Re: Сакраментальный вопрос о временных таблицах  [new]
gggguest
Guest
2 alexeyvg: это можно, но не очень хочется...
25 мар 04, 19:32    [597902]     Ответить | Цитировать Сообщить модератору
 Re: Сакраментальный вопрос о временных таблицах  [new]
Crimean
Member

Откуда:
Сообщений: 13148
drop procedure p1

go

create procedure p1
@c cursor varying out
as
declare @t table ( id int )
insert into @t select top 10 id from sysobjects
set @c = cursor static local for select id from @t
open @c
go

drop procedure p2
go

create procedure p2
as
declare @c cursor
exec p1 @c out

declare @i int
while 1=1 begin
fetch next from @c into @i
if @@fetch_status <> 0 break
print @i
end

close @c
deallocate @c
go


В результате


(10 row(s) affected)

1
2
3
4
6
8
9
10
11
12
25 мар 04, 19:46    [597921]     Ответить | Цитировать Сообщить модератору
 Re: Сакраментальный вопрос о временных таблицах  [new]
gggguest
Guest
Спасибо, Crimean. Я, видимо, упустил ключевое слово static. Завтра попробую проверить, убегаю.
25 мар 04, 20:48    [597970]     Ответить | Цитировать Сообщить модератору
 Re: Сакраментальный вопрос о временных таблицах  [new]
gggguest
Guest
Да, со static все работает. Хотя insert exec, наверно, лучше.

Спасибо за помощь.
26 мар 04, 11:13    [598579]     Ответить | Цитировать Сообщить модератору
 Re: Сакраментальный вопрос о временных таблицах  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
2gggguest

insert exec тоже будет вызывать перекомпиляции.
А передавать курсор - будет замедление. Нужно будет в вызывающей процедуре снова в таблицу вставлять. Тут надо тестировать, что лучьше - перекомпиляции или курсор. А вариант с SPID - таблицами не так-уж и плох, только за транзакциями нужно следить.
26 мар 04, 11:36    [598650]     Ответить | Цитировать Сообщить модератору
 Re: Сакраментальный вопрос о временных таблицах  [new]
gggguest
Guest
2 alexeyvg:
У меня insert exec не вызывает перекомпиляции, несколько раз трассу с SP:Recompile запускал (SQL2000):


CREATE PROCEDURE SP2 AS

select 'aa'
select 'bb'
GO


CREATE PROCEDURE SP1 AS

create table #tt (xx char(20))

insert #tt exec SP2

select * from #tt

GO


C курсором может, конечно, тормозить, хотя если все в кэше помещается, то не очень.
26 мар 04, 12:06    [598723]     Ответить | Цитировать Сообщить модератору
 Re: Сакраментальный вопрос о временных таблицах  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
2gggguest

Может, это потому, что после insert #tt exec SP2 у вас ничего нет, кроме выборки без условия? Я это смотрел на многих примерах, и если есть insert ... exec, то перед первым обращении с условиями, т.е. где план не на 100% однозначный, делается перекомпиляция.

Это как создание временной таблицы после первого выполняемого оператора - на тестовом примере перекомпиляций нет, а в реальной эксплуатации они постоянны.
26 мар 04, 13:31    [599050]     Ответить | Цитировать Сообщить модератору
 Re: Сакраментальный вопрос о временных таблицах  [new]
Crimean
Member

Откуда:
Сообщений: 13148
2 alexeyvg

А что , если все временные таблицы создавать ДО первого оператора , то перекомпиляций не будет ? (щаз пойду проверять)
26 мар 04, 13:43    [599101]     Ответить | Цитировать Сообщить модератору
 Re: Сакраментальный вопрос о временных таблицах  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31602
2Crimean
Да, нужно вперёд ставить create table. Перекомпиляции могут и быть, там-же ещё много причин.
26 мар 04, 15:40    [599576]     Ответить | Цитировать Сообщить модератору
 Re: Сакраментальный вопрос о временных таблицах  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Ну , вопрос был - бывают ли перекомпиляции ТОЛЬКО из-за этого!
26 мар 04, 16:37    [599763]     Ответить | Цитировать Сообщить модератору
 Re: Сакраментальный вопрос о временных таблицах  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Значится так , если есть временная таблица , то перекомпиляция будет . Это факт . Второй факт - их может быть много , больше чем по разу на запуск :) Вот от этого есть способы убежать . Так что временные таблицы - кака , но - необходимая кака :(
8 апр 04, 14:58    [618944]     Ответить | Цитировать Сообщить модератору
 Re: Сакраментальный вопрос о временных таблицах  [new]
SeVa
Member [заблокирован]

Откуда: Москва
Сообщений: 4324
Стандартный способ борьбы с этим - использовать табличную переменную в SP1 и inline функцию.
8 апр 04, 15:23    [619048]     Ответить | Цитировать Сообщить модератору
 Re: Сакраментальный вопрос о временных таблицах  [new]
Crimean
Member

Откуда:
Сообщений: 13148
С функцией все хорошо, но как ее вызвать с другого сервера, имя которого передано параметром?
8 апр 04, 15:53    [619141]     Ответить | Цитировать Сообщить модератору
 Re: Сакраментальный вопрос о временных таблицах  [new]
SeVa
Member [заблокирован]

Откуда: Москва
Сообщений: 4324
2 Crimean
Об этом не спрашивалось.
Для одного сервера,такой подход, часто бывает более оптимальным.
8 апр 04, 18:33    [619612]     Ответить | Цитировать Сообщить модератору
 Re: Сакраментальный вопрос о временных таблицах  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Функция не всегда возможна даже в рамках одного сервера :(
8 апр 04, 18:44    [619642]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить