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

Рейтинг: 4Ответов: 1Опубликовано: 21.04.2015

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

Ответы

▲ 5

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

Что бы работать с такими данными, нужно применить виртуализацию данных. Когда у вас, как бы, есть список из миллиона строк, но на самом деле, в памяти хранится не более сотни. А сами данные появляются/загружаются в момент обращения к ним.

Поддержку виртуализации данных следует включить и у контрола, отображающего данные. Вот хорошая статья и пример работы с такими таблицами: http://habrahabr.ru/post/208792/

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

  1. Перво-наперво, получаем количество строк в таблице запросом SELECT COUNT(id) FROM table

  2. Выбираем необходимый блок данных SELECT id FROM table SKIP n TAKE count

  3. Детализируем выбранные строки по id.

Таким образом мне удалось уменьшить время выборки данных до нескольких сотен миллисекунд, в не зависимости от того какой это блок первый или же последний