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

Откуда: Москва
Сообщений: 1176
Вопрос в контексте рекомпиляций. Какие еще есть решения, кроме как положить во внешнюю временную таблицу?
14 июл 15, 21:41    [17892719]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31950
Mike_za
Вопрос в контексте рекомпиляций. Какие еще есть решения, кроме как положить во внешнюю временную таблицу?
1. в XML
2. в постоянную таблицу
3. положить в временную таблицу (табличную переменную) конструкцией INSERT ... EXEC ...
4. заменить процедуру на табличную функцию
14 июл 15, 22:59    [17892965]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
alexeyvg,
Рекомпиляции действительно стоят таких подходов?
15 июл 15, 02:50    [17893266]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Mike_za,

А output table параметр?
15 июл 15, 10:47    [17893933]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
a_voronin
А output table параметр?


а разве можно ?
автор
You can use the user-defined table type to create table-valued parameters. Table-valued parameters can only be INPUT parameters and must be accompanied by the READONLY keyword. For more information, see Use Table-Valued Parameters (Database Engine)
15 июл 15, 11:04    [17894019]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
Mike_za, процедуры, в общем-то не предназначены для передачи каких-то массивов куда-то, здесь другая парадигма - все данные находятся в таблицах. Точка. Процедуры не обмениваются данными. Точка.


Если Вы пришли к вопросу о
Как вернуть массив из процедуры вызывающей процедуре

и
положить во внешнюю временную таблицу

значит Вы что-то делаете неверно или неверно поставили задачу.
15 июл 15, 12:21    [17894394]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
o-o
Guest
How to Share Data between Stored Procedures
15 июл 15, 12:41    [17894508]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
По-моему это всё издержки стремления заставить работать СУБД "как привык". Здесь нужен другой подход.
15 июл 15, 13:52    [17894947]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31950
Mike_za
alexeyvg,
Рекомпиляции действительно стоят таких подходов?

Общего рецепта нет.
Если процедура выполняется 2 мс, а рекомпилируется 200 мс, то стоит. А такое соотношение вполне реально.
15 июл 15, 13:56    [17894979]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31950
Владислав Колосов
Mike_za, процедуры, в общем-то не предназначены для передачи каких-то массивов куда-то, здесь другая парадигма - все данные находятся в таблицах. Точка. Процедуры не обмениваются данными. Точка.
Это они сейчас не предназначены, такая реализация у MS.

А для нормального программирования это желательно. Вот и выкручиваются люди.
15 июл 15, 13:59    [17894993]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
alexeyvg, а как вы отслеживаете время рекомпиляции процедур? Пока только из плана выдирать получилось
15 июл 15, 21:51    [17897196]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
o-o, спасибо за ссылку. Читаю
15 июл 15, 21:52    [17897202]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31950
Mike_za
alexeyvg, а как вы отслеживаете время рекомпиляции процедур? Пока только из плана выдирать получилось
Да я особо не заморачивался, смотрел, например, по времени выполнения. Да и вообще в последнее время работаю с хранилищем, там это всё не актуально.

Это же видно, при массовых рекомпиляциях сервер буквально перестаёт работать.
Тут правило простое - в массовых вызовах, для процедур, выполняющихся менее 100 мс, перекомпиляций быть не должно, иначе будет катастрофа с произодительностью.
15 июл 15, 21:56    [17897220]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
автор
Nevertheless, there is a special case that SQL Server MVP Itzik Ben-Gan made me aware of: if you create a global temp table in a start-up procedure, the global temp table will be around as long as the server is up, unless someone explicitly drops it. This makes it possible to use a global temp table as a process-keyed table. This way you can have a fixed and known schema for your process-keyed table but still get the reduced logging of tempdb.

Here is a quick sample of how you create a global temp table when SQL Server starts:

USE master
go
CREATE PROCEDURE create_global_temp AS
CREATE TABLE ##global(process_key uniqueidentifier NOT NULL,
-- other columns here
)
go
EXEC sp_procoption create_global_temp, 'startup', 'true'
It cannot be denied that there are some problems with this solution. What if you need to change the definition of the global temp table in way that cannot be handled with ALTER TABLE? Having to restart the server to get the new definition in place may not be acceptable. One way to address is to refer to your process-keyed table through a synonym (a feature added in SQL 2005). In development, you let the synonym point to a local table, and only when you are ready for production you change the synonym to refer to the global temp table. If you need to change the table definition while system is live, you create the new version of the table in the local database and change the synonym and run it that way until the server is restarted.
16 июл 15, 00:04    [17897585]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Чем сие лучше постоянной таблицы в tempdb?
16 июл 15, 10:09    [17898231]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
o-o
Guest
Mike_za
Чем сие лучше постоянной таблицы в tempdb?

тем, что на постоянную таблицу надо всем и каждому выдать разрешение,
а на ## не надо
16 июл 15, 10:17    [17898296]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
o-o, а можно ее создать в схеме с паблик доступом для всех, или не а такого?

Пс. У нас в системе забавно реализовали блок проверки прав. Типа кешутся права в глобальную времянку. Заходи из студии и сам себе что хочешь апдейть))))
16 июл 15, 11:17    [17898588]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
o-o
Guest
Mike_za
o-o, а можно ее создать в схеме с паблик доступом для всех, или не а такого?

конечно можно. создать схему или таблицу и выдать на нее права пабликy.
при рестарте сервера снова все то же самое проделать.
и если непредвиденный рестарт, то тоже предвидеть, как все это создать и выдать.

или зайти с другой стороны: проделать все это в model.
и при рестарте в tempdb все будет хорошо.
только еще в каждой новосозданной базе придется удалять схему/таблицу с правами.
но если базы не создаются совсем, почему бы и нет.
только по сумме наименее гиморно сделать как процитированно.
сделал и забыл
16 июл 15, 11:24    [17898611]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
invm
Member

Откуда: Москва
Сообщений: 9826
o-o
конечно можно. создать схему или таблицу и выдать на нее права пабликy.
при рестарте сервера снова все то же самое проделать.
Нет особой разницы, что создавать в startup-процедуре - глобальную временную таблицу или постоянную с раздачей прав.
16 июл 15, 11:32    [17898654]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
o-o
Guest
invm
o-o
конечно можно. создать схему или таблицу и выдать на нее права пабликy.
при рестарте сервера снова все то же самое проделать.
Нет особой разницы, что создавать в startup-процедуре - глобальную временную таблицу или постоянную с раздачей прав.

а, ну да, можно и автоматизировать через start-up procedure раздачу прав.
у Sommarskog-а то в статье упор не на автоматизацию, а на факт,
что если создавать ## именно в start-up procedure, то будет жить дольше положенного -- до server shutdown.
тогда вопрос
Mike_za
Чем сие лучше постоянной таблицы в tempdb?

переадресуем invm
16 июл 15, 11:56    [17898766]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Потестил постоянную таблицу с фильтром по @spid.

Кластерный ключ по (spid int, id identity)
Доступ через вью с фильтром по @spid
Если ее создать в темпдб, то ситуация под нагрузкой показалась получше чем в текущей базе.
Реально в темп дб кто нибудь создает?
17 июл 15, 20:49    [17906020]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31950
Mike_za
Реально в темп дб кто нибудь создает?
Да, разумеется.
Только вот разделение по spid будет вызывать блокировки. Так что зависит от сценариев использования.
17 июл 15, 20:57    [17906041]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
alexeyvg, а как еще можно разделить?
17 июл 15, 21:36    [17906136]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31950
Mike_za
alexeyvg, а как еще можно разделить?
Никак. Я имел в виду, что при необходимости делать это внутри транзакций, нужно выбирать какой то другой из вышеуказанных методов передачи данных.
17 июл 15, 23:09    [17906404]     Ответить | Цитировать Сообщить модератору
 Re: Как вернуть массив из процедуры вызывающей процедуре  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
alexeyvg, а разве сервер не должен лочить диапазоны кластерного ключа по спид?
Т.е. Касаемо варианта с общей таблицей самое оптимальное - это постоянная таблица в темдб?
18 июл 15, 00:58    [17906727]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить