Обработка большого набора записей ADODB в таблице данных?

Я загружаю большой набор результатов примерно из 3 миллионов строк (набор записей ADODB) в таблицу данных. Слишком много времени уходит даже на то, чтобы загрузить набор результатов в таблицу данных. Я хочу найти способ извлечь только часть набора результатов, а затем загрузить его в DataTable. В качестве альтернативы, есть ли способ напрямую прочитать набор записей напрямую, а не загружать его в таблицу данных, а затем читать?

Это код, который я использую для заполнения своей DataTable -

OleDbDataAdapter oleDA = new OleDbDataAdapter();
DataTable dt = new DataTable();
oleDA.Fill(dt, myADODBRecordset);

person Steam    schedule 12.11.2013    source источник
comment
Зависит... У вас есть доступ к запросу базы данных или хранимой процедуре? Вы хотите обрабатывать пакеты данных одновременно?   -  person Stinky Towel    schedule 12.11.2013
comment
@StinkyTowel - у меня есть доступ к запросу базы данных. Но я бы предпочел не редактировать его. В любом случае, я все еще хочу узнать все возможные решения моей проблемы.   -  person Steam    schedule 12.11.2013
comment
Не могли бы вы рассмотреть возможность использования System.Data.OleDb.OleDbDataReader msdn.microsoft.com/en-us/library/ это позволит только прямой доступ к данным, но это будет означать, что вам не нужно будет загружать весь набор данных в память.   -  person Sam Plus Plus    schedule 12.11.2013
comment
@SamPlusPlus - у меня есть несколько вопросов. Можете ли вы ответить на них для меня? - Сможет ли он считывать данные из набора записей ADODB? Будет ли какой-либо способ контролировать количество строк, которые я могу прочитать за раз? Есть ли какое-либо кэширование диска? Спасибо.   -  person Steam    schedule 12.11.2013
comment
@blasto Как вы получаете свой набор данных? Не могли бы вы использовать считыватель данных вместо получения набора записей ADODB?   -  person Sam Plus Plus    schedule 13.11.2013
comment
@blasto - для чего вы используете данные? Строки 3M могут быть дерьмовыми и чрезвычайно тяжелыми в зависимости от того, что находится в данных. Вам нужно все это один раз?   -  person Stinky Towel    schedule 13.11.2013
comment
@StinkyTowel - на самом деле мне это не нужно все сразу. Я не хотел менять свой код, поэтому я пытался сделать это таким образом. Теперь я извлекаю данные партиями.   -  person Steam    schedule 14.11.2013


Ответы (2)


Вот несколько вариантов для рассмотрения:

  1. Получите только те строки и столбцы, с которыми вам действительно нужно работать.

  2. Получите некоторые данные и позвольте пользователю запросить следующий набор строк, когда он захочет.

  3. Пишите оптимизированные SQL-запросы

  4. Не используйте DataTable без необходимости, потому что он содержит больше информации о метаданных, чем другие объекты типа списка.

  5. Рассмотрите возможность использования управляемого поставщика .NET.

person NoChance    schedule 12.11.2013
comment
Я уже делаю 1 и 2. Я не знаю, что имеется в виду под 3. 4 - мне нужно повторить набор записей, как если бы это была таблица базы данных в памяти. Есть ли другой класс для этого? 5. Что это? - person Steam; 12.11.2013

Зачем загружать такие большие данные в память? Большая транзакция данных должна потреблять большие ресурсы, поэтому оптимизируйте свой код или используйте EF.

person xinfa    schedule 12.11.2013
comment
Что такое ЭФ? Никогда об этом не слышал. - person Steam; 12.11.2013