Страницы

Поиск по вопросам

вторник, 7 января 2020 г.

Чтение данных из БД блоками

#c_sharp #база_данных


В таблице БД очень большое количество строк, так что если считывать их все сразу
в DataTable, система начинает сильно тормозить из-за нехватки памяти. Мне нет необходимости
иметь в памяти все строки. Как можно считывать строки блоками, например, по 50000 строк?
Планировал считывать данные построчно с помощью DataReader, но не нашел нормального
способа скопировать текущую строку DataReader в DataTable (вариант с явной итерацией
по колонкам не очень хорош). Решение, когда выборка каждый раз строится заново для
нового блока, мне известно, но хотелось бы понять как решить задачу иначе.
    


Ответы

Ответ 1



Таблицы с десятками, сотнями тысяч строк с большим количеством столбцов вы ни когда не сможете быстро отобразить. Таблицу с несколькими сотнями тысяч строк вы не сможете даже загрузить. Не хватит памяти. Что бы работать с такими данными, нужно применить виртуализацию данных. Когда у вас, как бы, есть список из миллиона строк, но на самом деле, в памяти хранится не более сотни. А сами данные появляются/загружаются в момент обращения к ним. Поддержку виртуализации данных следует включить и у контрола, отображающего данные. Вот хорошая статья и пример работы с такими таблицами: http://habrahabr.ru/post/208792/ В дополнение. Из собственного опыта, как этот процесс можно ускорить, при таблице с количеством строк больше миллиона, и количеством столбцов больше десятка. Перво-наперво, получаем количество строк в таблице запросом SELECT COUNT(id) FROM table Выбираем необходимый блок данных SELECT id FROM table SKIP n TAKE count Детализируем выбранные строки по id. Таким образом мне удалось уменьшить время выборки данных до нескольких сотен миллисекунд, в не зависимости от того какой это блок первый или же последний

Комментариев нет:

Отправить комментарий