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

Откуда:
Сообщений: 139
Как студия реализует "возврат результата по частям" ? Если выполнить простой Select из большой таблицы, и вручную прокручивать скроллер, то будут подгружаться все новые и новые записи. Как написать такую процедуру, и как работать с клиентской стороны ?
29 ноя 17, 17:17    [20993003]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
TsHeloWorlder,

у меня какая-то другая студиия.... Ну и решения вроде есть для многих Яп
29 ноя 17, 17:23    [20993037]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
TsHeloWorlder
Member

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

Селектните любую большую таблицу и мышкой прокручивайте скроллер в конец. Каждый раз будут добавляться новые записи, и у скроллера конец уходить дальше. Как это сделано ? Хотелось бы заюзать такой функционал в своей программе.


TaPaK
Ну и решения вроде есть для многих Яп

Вот тут не понял. Какое решение есть ? Дайте наводочку пожалуйста.
29 ноя 17, 17:32    [20993106]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
TsHeloWorlder
Member

Откуда:
Сообщений: 139
В принципе я могу это реализовать через "Pagination with OFFSET / FETCH". Но ведь это будут отдельные запросы. Каждый раз запрашивая новую страницу, я получу и новые результаты, которые добавились за это время. Так ?
Или можно поиграться с уровнем изоляции, включив REPEATABLE READ в транзакции, после чего можно спокойно запрашивать данные порционно через OFFSET / FETCH ?
29 ноя 17, 17:36    [20993130]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
TsHeloWorlder
Как студия реализует "возврат результата по частям" ? Если выполнить простой Select из большой таблицы, и вручную прокручивать скроллер, то будут подгружаться все новые и новые записи. Как написать такую процедуру, и как работать с клиентской стороны ?
Management Studio такого не реализует.
Она подгружает новые записи по мере того, как они вычитываются кодом, а не по мере прокрутки скроллера, насколько мне известно.
Реализация зависит от языка программирования, основной принцип - отображение интерфейса и вычитка данных должны идти в разных потоках, тогда вы сможете отобразить часть строк до того, как загрузите их все. Можно, конечно, остановить вычитку данных на определенном уровне, но это крайне нежелательно - вы будете держать коннект к базе и, если я не ошибаюсь, блокировку на объектах, пока не вычитаете все данные. Поэтому для постраничного отображения данных обычно используют параметры OFFSET и FETCH NEXT для вычитки только нужной части набора.
29 ноя 17, 17:38    [20993135]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
TsHeloWorlder,

автор
Селектните любую большую таблицу и мышкой прокручивайте скроллер в конец. Каждый раз будут добавляться новые записи, и у скроллера конец уходить дальше. Как это сделано ? Хотелось бы заюзать такой функционал в своей программе.

а моя так не делает :*(
ЯП какой? ну и гугел "Load large dataset scroll" или партиями
29 ноя 17, 17:43    [20993153]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
TsHeloWorlder
Member

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

Об этом я и говорю. Хочу узнать как студия "вычитывает данные кодом" по кускам.
Может быть там просто серверный курсор, и студия загружает из него сколько-то строк, а при скролировании дочитывает новые ?
29 ноя 17, 17:44    [20993156]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
TsHeloWorlder
Member

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

яп ? наверное C# если я правильно понял о чем речь :)
29 ноя 17, 17:44    [20993158]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
TsHeloWorlder
TaPaK,

яп ? наверное C# если я правильно понял о чем речь :)

ну обыная практика для gidview это "листать",а не под скрол, и чем делать партии уже на выбор. Хотя может мода и изменилась, но тут больше под веб реализации
29 ноя 17, 17:50    [20993178]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
TsHeloWorlder
Minamoto,

Об этом я и говорю. Хочу узнать как студия "вычитывает данные кодом" по кускам.
Может быть там просто серверный курсор, и студия загружает из него сколько-то строк, а при скролировании дочитывает новые ?
Нет, вы не о том говорите. Еще раз - скроллирование не при чем. Если возвращаемый набор очень большой, она возвращает его кусками, по мере вычитывания. Можете вообще не скроллировать - все равно вам вернется в итоге весь набор данных.
Как реализовано - скорее всего, многопоточностью, когда вычитывают и отображают разные потоки.
29 ноя 17, 17:51    [20993183]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7660
ADO, ODBC так и работает, т.е. клиента можно запрограммировать на частичное получение результата. В ХП можно использовать курсор для возврата результата, получится нечто вроде "пайплайн". Справку про курсоры почитайте.
29 ноя 17, 17:59    [20993219]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
TsHeloWorlder
Member

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

Мне вообще не нужен скролл. Я просто описал то, как делает это SQL студия, чтобы объяснить суть эффекта, который меня заинтересовал.
Мне нужно, чтобы, в случае очень большого набора данных, можно было получать данные от базы как можно скорее - как только готовые первые 10 - и сразу же начинать их обрабатывать, подтягивая оставшиеся по мере готовности. Все это в бэкэндовой части программы, которая вообще без пользовательского интерфейса.

Вот и ищу решение.
Простая пагинация через OFFSET / FETCH мне кажется не подойдет. Либо придется включать большой уровень изоляции (repeatable read), либо записи смогут плавать между страницами - и повторно обрабатываться в бэкэнде. Сами понимаете, чем это чревато: двойные обработки, или недоработки.
29 ноя 17, 18:03    [20993230]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
TsHeloWorlder,

вопрос к sql server не понятен. repeatable read это для клиентской части вам ничего не даст, или вы коннект с транзакцией держать будете?(спаси и сохрани)
29 ноя 17, 18:08    [20993240]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
TsHeloWorlder
Member

Откуда:
Сообщений: 139
Владислав Колосов,

Угу. Тут 20993156 я в принципе и высказал предположение, что решение лежит в курсорах. Но думал, может есть другое решение, хотел узнать мнения или даже решения.
Думаете решение лежит в этом способе и других больше нет ?

Тогда еще вопрос. Как ускорить выполнение запроса, для получения первых записей быстрее, чтобы курсор максимально быстро начал отдачу? Через OPTION (FAST N) ?
29 ноя 17, 18:10    [20993245]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36902
TsHeloWorlder
TaPaK,

Мне вообще не нужен скролл. Я просто описал то, как делает это SQL студия, чтобы объяснить суть эффекта, который меня заинтересовал.
Мне нужно, чтобы, в случае очень большого набора данных, можно было получать данные от базы как можно скорее - как только готовые первые 10 - и сразу же начинать их обрабатывать, подтягивая оставшиеся по мере готовности. Все это в бэкэндовой части программы, которая вообще без пользовательского интерфейса.

Вот и ищу решение.
Простая пагинация через OFFSET / FETCH мне кажется не подойдет. Либо придется включать большой уровень изоляции (repeatable read), либо записи смогут плавать между страницами - и повторно обрабатываться в бэкэнде. Сами понимаете, чем это чревато: двойные обработки, или недоработки.
Каша, мед, г..но и гвозди.

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

И пофиг на фетч.

И да, если в плане будут блокирующие операции (типа, оператора sort), то первые 10 записей из большого набора придется ждать.
29 ноя 17, 18:12    [20993249]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
TsHeloWorlder
Member

Откуда:
Сообщений: 139
TaPaK
TsHeloWorlder,

вопрос к sql server не понятен. repeatable read это для клиентской части вам ничего не даст, или вы коннект с транзакцией держать будете?(спаси и сохрани)


Вот именно, что мрак. Но как еще, без открытой транзакции и изоляции, обеспечить, чтобы при запросе каждой следующей страницы пагинации данные не перетекали туда-сюда ?
Получается данное решение не подходит.
29 ноя 17, 18:12    [20993250]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
TsHeloWorlder
TaPaK,

Мне вообще не нужен скролл. Я просто описал то, как делает это SQL студия, чтобы объяснить суть эффекта, который меня заинтересовал.
Мне нужно, чтобы, в случае очень большого набора данных, можно было получать данные от базы как можно скорее - как только готовые первые 10 - и сразу же начинать их обрабатывать, подтягивая оставшиеся по мере готовности. Все это в бэкэндовой части программы, которая вообще без пользовательского интерфейса.

Вот и ищу решение.
Простая пагинация через OFFSET / FETCH мне кажется не подойдет. Либо придется включать большой уровень изоляции (repeatable read), либо записи смогут плавать между страницами - и повторно обрабатываться в бэкэнде. Сами понимаете, чем это чревато: двойные обработки, или недоработки.

Я ж забыл, что все сейчас пользуются классами, которые сразу все вычитывают...

Хоть это и вопрос не по теме форума, вам нужен класс SqlDataReader, и его метод Read(), который будет читать датасет построчно, а не сразу полностью. Я не великий специалист в C#, так что лучше проверьте сами, что он работает как надо, или проконсультируйтесь на соответствующем форуме, чтобы убедиться, что я вас не обманываю.
29 ноя 17, 18:13    [20993252]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
TsHeloWorlder,

Вы путаете, выдачу данных клиенту из кеша результата и формирование этих данных, кеш результата заполняется не по мере "готовности", а когда все готово, точнее даже не заполняется, а открывается для передачи данных клиенту,
а вот при передаче, когда сам запрос уже отработал и все данные в кеше, уже клиент забирает пачками, по мере возможности, производительности, скорости сети, как угодно,
и то что вы видите в студии, это то как она выгребает данные из кеша результата, а не то как сервер эти данные ей отдает, он готов отдать сразу весь кеш, но вот студия не готова принять весь миллион записей разом и забирает из кеша пачками, а реализуется это драйвером работы с сиквелом.
29 ноя 17, 18:14    [20993258]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31328
TsHeloWorlder
TaPaK,

Мне вообще не нужен скролл. Я просто описал то, как делает это SQL студия, чтобы объяснить суть эффекта, который меня заинтересовал.
Мне нужно, чтобы, в случае очень большого набора данных, можно было получать данные от базы как можно скорее - как только готовые первые 10 - и сразу же начинать их обрабатывать, подтягивая оставшиеся по мере готовности. Все это в бэкэндовой части программы, которая вообще без пользовательского интерфейса.

Вот и ищу решение.
Простая пагинация через OFFSET / FETCH мне кажется не подойдет. Либо придется включать большой уровень изоляции (repeatable read), либо записи смогут плавать между страницами - и повторно обрабатываться в бэкэнде. Сами понимаете, чем это чревато: двойные обработки, или недоработки.
Достаточно просто читать данные из рекордсета. Обрабатывайте пришедшие данные, не дожидаясь прихода всех строк.
Студия именно так и делает, ничего особенного там нет.
Ну, можно разделить получение данных, и их обработку на 2 потока, это поможет, если обработка неравномерна, или делается с большими блоками данных.
29 ноя 17, 18:14    [20993260]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31328
Minamoto
вам нужен класс SqlDataReader, и его метод Read(), который будет читать датасет построчно
Вот именно. Программа уже обрабатывает данные, а запрос на сервере при этом ещё выполняется.
29 ноя 17, 18:15    [20993264]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Это вы курсы по программированию закончили "Senior c# за 10 дней"? У вас для начала есть бизнес модель как вы собираетесь отдавать данные разным клиентам и что бы они не редактировали одно и то же? Вопрос загрузки миллиона записей звучит странно в данном контексте
29 ноя 17, 18:17    [20993266]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
TsHeloWorlder
Member

Откуда:
Сообщений: 139
ага. кажется понятно. Наверное да, нужно через SqlDataReader построчно считывать данные.

Т.е. если я сделаю селект из огромной таблицы, то я сразу же начну получать данные, покуда нету сортировки - требующей анализа всей таблицы ?

Получается курсор не нужен, достаточно простейшего селекта да ?
29 ноя 17, 18:21    [20993272]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
TsHeloWorlder
ага. кажется понятно. Наверное да, нужно через SqlDataReader построчно считывать данные.

Т.е. если я сделаю селект из огромной таблицы, то я сразу же начну получать данные, покуда нету сортировки - требующей анализа всей таблицы ?

Получается курсор не нужен, достаточно простейшего селекта да ?
Не сразу, а как только сервер будет готов вам данные отдать. если там тупой "select *", то это произойдет довольно быстро, а если сортировки, группировки - то сильно медленнее.
29 ноя 17, 18:33    [20993302]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31328
TsHeloWorlder
Т.е. если я сделаю селект из огромной таблицы, то я сразу же начну получать данные, покуда нету сортировки - требующей анализа всей таблицы ?
С сортировкой тоже. А насколько "сразу", зависит от конкретики запроса.
29 ноя 17, 18:37    [20993316]     Ответить | Цитировать Сообщить модератору
 Re: Как это реализуется Management студией ?  [new]
TsHeloWorlder
Member

Откуда:
Сообщений: 139
Можете еще подсказать как максимально ускорить запрос на отдачу первых записей, чтобы получить максимум отдачи при таком подходе ?

OPTION(FAST N) будет достаточно ? А после выдачи N записей, насколько медленней будет отдаваться N+1 и последующие ?
29 ноя 17, 18:47    [20993341]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить