#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. Таким образом мне удалось уменьшить время выборки данных до нескольких сотен миллисекунд, в не зависимости от того какой это блок первый или же последний
Комментариев нет:
Отправить комментарий