Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Отличается ли механизм возвращения данных из view и stored procedure ?  [new]
harles
Guest
Судя по sql clr для передачи данных используется класс SqlPipe и его метод Send. А как данные выбираются из view ? Так же подобный pipe? Подскажите пожалуйста где можно почитать по внутренности хранения result set сервером и выборкой клиентом. Ничего не могу найти.

Спасибо.
9 янв 12, 19:50    [11875368]     Ответить | Цитировать Сообщить модератору
 Re: Отличается ли механизм возвращения данных из view и stored procedure ?  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
harles
Судя по sql clr для передачи данных используется класс SqlPipe и его метод Send. А как данные выбираются из view ? Так же подобный pipe? Подскажите пожалуйста где можно почитать по внутренности хранения result set сервером и выборкой клиентом. Ничего не могу найти.

Спасибо.


А что такое SqlPipe? И откуда он берется? Ответите на этот вопрос = ответите и на свой!
10 янв 12, 11:00    [11877201]     Ответить | Цитировать Сообщить модератору
 Re: Отличается ли механизм возвращения данных из view и stored procedure ?  [new]
harles
Guest
Вот читаю msdn по SqlPipe :

Allows managed stored procedures running in-process on a SQL Server database to return results back to the caller.


Что-то не вижу ответа ?

Вопрос был : в чем внутреннее отличие между прямой выборкой из вью и выборкой внутри процудуры, как сервер хранит результаты пока их клиент не заберет.
10 янв 12, 11:30    [11877382]     Ответить | Цитировать Сообщить модератору
 Re: Отличается ли механизм возвращения данных из view и stored procedure ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
harles
как сервер хранит результаты пока их клиент не заберет.

У каждого коннекта есть специальный буфер вывода. В котором и хранятся возвращаемые клиенту результаты.

DBCC OUTPUTBUFFER
Returns the current output buffer in hexadecimal and ASCII format for the specified session_id.
10 янв 12, 11:41    [11877448]     Ответить | Цитировать Сообщить модератору
 Re: Отличается ли механизм возвращения данных из view и stored procedure ?  [new]
harles
Guest
Спасибо за ответы.

Правильно ли я понимаю?
Например есть таблица с миллионом строк. dbo.MyTable (id INT NOT NULL PRIMARY KEY)

CREATE PRCOCEDURE dbo.GetAllRecords 
AS 
SET NOCOUNT ON; 

SELECT 
             mt.id
FROM dbo.MyTable AS mt 


Или вью :
CREATE VIEW dbo.vwAllMyTable 
AS 
SELECT t.id 
FROM dbo.MyTable AS t 


При запуске процедуры или выборке иp вью, сервер сначала выролняет запрос, складывает результаты в свой внутренний буфер.
А клиент потом данные забирает уже из буффера.
Т.е к примеру на клиенте : 1) открываю соединение 2) выполняю команду ( В этот моменет резалт сет помещается в буффер) 3) Потом когда я данные получаю DataReader-ом, то они выбираются из буффера. Как только я закрываю read, то использованное место может быть особождено.

1) Т.е нет разницы в механизме получения данных в процедурах и представлениях ???
2) Есть ли какой-нибудь счетчик, котрый бы показывал размер буффера с результатами ? (посмотрел SqlServer:BufferManager и SqlServer:MemmoryManager, но ничего похожего не нашел.
10 янв 12, 13:02    [11878140]     Ответить | Цитировать Сообщить модератору
 Re: Отличается ли механизм возвращения данных из view и stored procedure ?  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
harles
Правильно ли я понимаю?
*****

При запуске процедуры или выборке иp вью, сервер сначала выролняет запрос, складывает результаты в свой внутренний буфер.
А клиент потом данные забирает уже из буффера.
Т.е к примеру на клиенте : 1) открываю соединение 2) выполняю команду ( В этот моменет резалт сет помещается в буффер) 3) Потом когда я данные получаю DataReader-ом, то они выбираются из буффера. Как только я закрываю read, то использованное место может быть особождено.

1) Т.е нет разницы в механизме получения данных в процедурах и представлениях ???
2) Есть ли какой-нибудь счетчик, котрый бы показывал размер буффера с результатами ? (посмотрел SqlServer:BufferManager и SqlServer:MemmoryManager, но ничего похожего не нашел.


1. "Механизм" получения данных отличается только в Вашем, пользовательском представлении (видении). Для MS SQL этот механизм одинаков.

2. На счет понимания - в общих чертах правильно. Но не совсем понятно - зачем Вам сейчас копать в этом направлении.

Утрировано
1. Клиент создает команду - SQL-запрос
2. Открывает коннект с сервером (причем необязательно по протоколу NamedPipes)
3. Передает серверу SQL-запрос
4. Сервер обрабатывает SQL-запрос - выдает результат (ну строит план выполнения и т.д. = процесс длительный и двумя словами не описывается)

т.е. Вы не работаете с данными на прямую... между Вашим приложением и данными есть куча прослоек, промежуточных звеньев.


А вообще в БОЛе точно было описание процесса выполнения запроса - стоит поискать.
10 янв 12, 13:35    [11878435]     Ответить | Цитировать Сообщить модератору
 Re: Отличается ли механизм возвращения данных из view и stored procedure ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
harles
Т.е к примеру на клиенте : 1) открываю соединение 2) выполняю команду ( В этот моменет резалт сет помещается в буффер) 3) Потом когда я данные получаю DataReader-ом, то они выбираются из буффера. Как только я закрываю read, то использованное место может быть особождено.

Не совсем так
Размер буфера - фиксированный.
Т.е. если ваш клиент не забирает данные, то при заполнении буффера выполнение запроса будет приостановлено.
Поэтому очень многие программисты, выполняющие запросы с миллионами записей в возврате, очень удивляются, что их запрос продолжает блокировать таблицы.
10 янв 12, 13:39    [11878456]     Ответить | Цитировать Сообщить модератору
 Re: Отличается ли механизм возвращения данных из view и stored procedure ?  [new]
harles
Guest
Я собираюсь в sqlclr процедуре выбирать не то чтобы миллионы, но 60 - 80 тысяч строк по 12 байт каждая, потом их обрабатывать. Логика очень сложная и если не использовать временные таблицы, то получается очень много дублирования кода.
А у временных таблиц есть недостаток - deffered compile если они созданы вне процедуры. Процедура с 5000 строк кода - это тоже не выход.

У меня было и остается желание работать с данными как с потоком, т.е выбирать данные из примтивных вью или процедур и затем обрабатывть.
Поделитесь пожалуйста опытом, опасны ли такие выборки по 60-80 тысяч, может мой путь заведомо ошибочный ?

Спасибо.
10 янв 12, 15:09    [11879252]     Ответить | Цитировать Сообщить модератору
 Re: Отличается ли механизм возвращения данных из view и stored procedure ?  [new]
Wizard2007
Member

Откуда:
Сообщений: 316
harles,

Может проще выбрать данные в класс и обработать в исполняемом файле. Это спасет от временных таблиц и прочих не удобст в которе связанны с выделением подпрограмм в SQL
10 янв 12, 15:14    [11879297]     Ответить | Цитировать Сообщить модератору
 Re: Отличается ли механизм возвращения данных из view и stored procedure ?  [new]
harles
Guest
Может проще выбрать данные в класс и обработать в исполняемом файле. Это спасет от временных таблиц и прочих не удобст в которе связанны с выделением подпрограмм в SQL


Так оно так и сделано, данные выбираются в коллекцию и обрабатыватся уже коллекция. Тем самым абстрагируемся от хранения данных, т.е если мне нужно произвести идентичные модификации над данным из 5 таблиц, мне нужно 5 раз дублировать код обработки. Не хранить же их вместе из-за этого.
10 янв 12, 15:22    [11879390]     Ответить | Цитировать Сообщить модератору
 Re: Отличается ли механизм возвращения данных из view и stored procedure ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
harles
У меня было и остается желание работать с данными как с потоком, т.е выбирать данные из примтивных вью или процедур и затем обрабатывть.
Поделитесь пожалуйста опытом, опасны ли такие выборки по 60-80 тысяч, может мой путь заведомо ошибочный ?

Опасность только в том, что если ваша обработка отдельной записи результата будет длиться так долго, что буфер вывода на сервере будет заполнен.
Самый яркий пример, когда в грид пользователю выводят десяток записей из миллиона.
И все ждут, когда же пользователь соизволит пролистать список.
10 янв 12, 15:57    [11879762]     Ответить | Цитировать Сообщить модератору
 Re: Отличается ли механизм возвращения данных из view и stored procedure ?  [new]
Wizard2007
Member

Откуда:
Сообщений: 316
harles,

то мешает написать одну процедуру, в которой будет что то вычисляться, результат который вернется уже в зависимости от класса куда - то сохранять. . То есть есть базовый класс с этой процедурой и результатами а в базовом выбираются данные, обрабатываются процедурой и сохраняются обратно в базу . Таким образом у нас идет обработка одной процедурой, а и и сходные данные результаты распределяются по полям в зависимости от производного класса.
13 янв 12, 10:58    [11897542]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить