|
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
|
|||||||||||
Как можно читать данные порциями?23.02.2021, 17:45. Показов 5114. Ответов 34
Метки нет (Все метки)
Привет!
Хотелось бы разобраться со следующим вопросом. Есть у нас какая-то БД. Есть там какая-то большая таблица, которую надо вычитать приложению, и выполнить какую-то обработку над каждой записью. Запрос на выборку выглядит так:
Что бы я хотел: что бы запрос остался таким же, как есть, а я как-то просто дал серверу (или драйверу?) указание: давай ка мне поэтому запросу 1000 записей, теперь давай следующую 1000, теперь еще 1000 и т.п. В коде на примере MS SQL-я это могло бы выглядеть так:
Или же кроме как разбить запрос на какие-то подзапросы, которые бы возвращали меньше данных чем выборка всей таблицы, ничего не сделаешь?
0
|
|||||||||||
| 23.02.2021, 17:45 | |
|
Ответы с готовыми решениями:
34
Как подгружать данные порциями в ItemsRepeater? Как сделать, чтобы в программе сохранялись данные в файл и можно было читать из сохраненного файла? Можно ли читать данные программой на Java из файлов Excel? |
|
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
|
|
| 24.02.2021, 15:37 [ТС] | |
|
0
|
|
|
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,721
|
|||||||
| 24.02.2021, 16:17 | |||||||
0
|
|||||||
|
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
|
|
| 24.02.2021, 16:54 | |
|
V0fka,
.. ну, если уж костылить, то можно, например (если есть автоинкрементное поле - если нет, добавить) вытаскивать через SELECT TOP 1000 WHERE autoId > offset, где offset , будет последний autoID в порции .. По сути это то же самое, но может будет быстрее .. А может, и не будет ..
0
|
|
|
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
|
||||||||||||
| 24.02.2021, 17:13 [ТС] | ||||||||||||
carrotik, вопрос именно в том как бы не костылить
0
|
||||||||||||
|
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
|
||
| 24.02.2021, 18:03 | ||
|
0
|
||
|
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
|
||
| 24.02.2021, 20:27 [ТС] | ||
|
0
|
||
|
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
||
| 24.02.2021, 23:54 | ||
|
Способы можно разделить на 3 типа: 1. Низкий уровень (ADO.NET). С помощью SQL-предикатов offset-fetch https://info-comp.ru/obuchenie... t-sql.html составляется нативный запрос SELECT. Отслеживание порций (страниц) - логикой приложения (листание). 2. Уровень Linq с использованием репозитория и моделей. Логика в алгоритмах имплементации (методах репозитория) 3. Высокий уровень - использование ORM, в общих чертах описанный здесь Usaga Добавлено через 2 минуты Однако так и не смог понять серьезных причин для тягания на клиента 1 млн записей, пусть даже небольшими порциями
0
|
||
|
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,721
|
|||
| 25.02.2021, 07:35 | |||
0
|
|||
|
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
|
|||||||||||
| 26.02.2021, 16:12 [ТС] | |||||||||||
|
Usaga, я провел эксперимент со 100 000 строк. Событие SQL:BatchCompleted возникает в момент выполнения строки кода
Теперь я быхотел понять как это может быть реализовано? Интересен принцип, концепция, а не конкретная реализация. Как я себе это представляю. В момент SqlDataReader reader = command.ExecuteReader(); через сокет на сервер отправляется запрос. Сервер выполняет запрос, помещает себе данные в tempdb и отправляет какую-то порцию данных в сокет, откуда пришел этот запрос и в конце какое-то сообщение "конец порции" (если отправил не все данные). При этом СКЛ как-то запоминает что конкретно уже отправил в клиентский сокет и слушает его дальше. Клиент читает сокет до момента пока не придет какое-то сообщение типа "конец порции", кладет себе данные в какой-то буфер и запоминает, что это не конец данных, а конец порции. Когда буфер дочитывается кем-то, он отправляет в тот же открытый сокет сообщение типа "давай следующую порцию" и СКЛ сервер отправляет ему очередную порцию. Если СКЛ сервер все данные отправил в сокет, он посылает какое-то сообщение, типа "закончили", разрывает подключение и чистит tempdb.Или это как-то проще делается?
0
|
|||||||||||
|
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
|
|
| 26.02.2021, 16:17 | |
|
V0fka,
..а вы попробуйте выдернуть сетевой шнур (витую пару, не силовой), тогда будет более понятно, а где, собственно, буфер - на сервере, или на клиенте ... Если вы останавливаете службу MSSQL Server, то это не означает, что поток данных сразу разрывается ...
0
|
|
|
|
|
| 26.02.2021, 17:38 | |
Сообщение было отмечено V0fka как решение
Решение
1
|
|
|
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
||
| 26.02.2021, 18:01 | ||
|
Ага. Именно так все и происходит. Машинист электровоза ни фига не нажмет на "газ" пока лично не спросит у каждого пассажира всех 22 вагонов, а также у их провожающих, готовы ли они ехать ![]() Добавлено через 11 минут Клиенту по большому счету по барабану, как там сервер что-то кэширует и кэширует ли вообще. Он должен лишь знать, что пересылка больших объемов данных непременно коснется производительности его самого. Поэтому и не рекомендуется (а в "правильных" софтверных конторах прямо запрещается) гонять тысячи строк, которые ни одному юзеру (человеку) просто не осилить. Например, есть отчет. Сложный. Состоящий из десятков шагов с выборками из кучи таблиц, группировкой, подсчетами агрегатов, итоговой сортировкой. Есть два пути: 1. Все эти шаги организовать на Клиенте. Все 101. Выполняя их последовательно - один-за-другим. И в итоге получить некоторую таблицу, которую и загнать в готовый отчет. 2. Весь алгоритм "поручить" серверу, завернув его в SP, и по исполнении получить результирующий датасет, который и уложится в отчет. Вопрос: Какой путь верный ибо несет минимальные издержки на обоих концах, дает 100% достоверный результат, шустрый и не требует километров кода в приложении ?
0
|
||
|
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,721
|
||
| 27.02.2021, 06:29 | ||
|
0
|
||
|
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
|
|
| 04.03.2021, 14:19 [ТС] | |
|
Коллеги, всем спасибо за ответы!
То что меня интересовало, наверное, описал Cupko в своем посте. То есть все это "порционное" чтение происходит на сетевом уровне. Как я понял. SQL сервер выполняет запрос и просто выплевывает результат в сокет. Дальше эти данные уже как-то буферизируются на каком-то низком уровне (на уровне ОС?) и операционная система заботится об их отправке. Клиент начинает читать из сокета в свой буфер. По мере чтения буфер сервера освобождается. Как-то так или я опять не туда?
0
|
|
|
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
|
|||
| 04.03.2021, 15:56 | |||
|
Добавлено через 1 минуту
0
|
|||
| 04.03.2021, 15:56 | |
|
Брать данные из коллекции порциями Как в VBA записать данные в реестр и читать данные из реестра? Как из VB читать данные с реестра? как читать данные из dbgrid Как получать/читать данные с COM порта Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
|
После бана на Пикабу не работает авторизация аккаунта с Яндекса.
Hrethgir 09.07.2026
В частности https:/ / auto. ru/ logbook/ zapret-na-vozhdenie-posle-65-let_1cf28789-07b4-4c75-a2f7-4cd4edf9deeb тут хотел оставить комментарий такой
Зрите в корень - монополизация на разработку программ. . .
|
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
|
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
|
|
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал.
Оно само - говорит.
Кто слышит тот слышит.
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|