2012-06-09 4 views
0
public DataTable FetchData(string sQuery) 
    { 
    DataTable dtable = new DataTable();   

    using (SqlConnection conn = new SqlConnection(conString)) 
    { 
     conn.Open(); 

     using (SqlCommand sqlCmd = new SqlCommand(sQuery, conn)) 
     { 
     SqlDataReader sdRead = sqlCmd.ExecuteReader(); 
     dtable.Load(sdRead); 
     } 
    } 

return dtable; 
} 


Datatable dt = FetchData(string sQuery); 
foreach(DataRow row in table.Rows) 
    ClassA obj = new ClassA(row); 

// Some manipulations 
    //..... 

Class A 
{ 

    int id; 
    int name; 

A(DataRow dr) 
{ 

    id = dr["ID"]; 
    name = dr["Name"]; 

} 
} 

Мне нужно получить почти 15 000 000 строк из базы данных.Datatable Performance в C# .Net

Мне нужны предложения для двух сценариев.

  1. Я вызываю вышеуказанный метод 1-5 раз, поэтому, очевидно, он создает 1-5 соединений. Если значение 10-20 раз превышает производительность? (или создать одно глобальное соединение и открыть 1 соединение и обработать все, а затем закрыть в конце.)

  2. А как насчет datatable? Любая альтернатива. Я думаю, что мне нужно отключить архитектуру для этой большой части строк. Мне нужно набивать мои собственные объекты класса с помощью полученных данных (или Iterate datareader, и использовать List<objects> внутри FetchData()).

Любые предложения?

+4

«Мне нужно получить почти 15 000 000 записей из базы данных». - Что ты собираешься с ними делать? –

+1

* Любые предложения? * Если - не загружать 15 миллионов строк одновременно. Что вам нужно делать с ними? Если это возможно: переместите обработку на сервер - обработайте данные, используя, например, T-SQL хранит процедуры и возвращает только значительно меньший результат, возвращаемый вашему приложению. –

+0

@Mitch Wheat: Мне нужно получить почти 15 000 000 записей из базы данных. - Что вы собираетесь с ними делать. У меня есть класс Parser имеет свойства по отношению к столбцам, которые я получил. Я заполняю объект и делаю некоторые манипуляции с этим объектом. Прямо сейчас я повторяю типы данных и создаю объекты. –

ответ

2

Сначала вы можете попробовать предварительно обработать как можно больше вещей в базе данных (вот что они умеют.).

Затем вам придется масштабировать данные, которые вы извлекаете и распараллеливаете операции. Позвольте мне объяснить некоторые из проблем здесь:

  1. Вы пытаетесь загрузить огромное количество данных через один сетевой трубы
  2. Затем Вы пытаетесь сохранить все огромное количество данных в оперативной памяти
  3. Затем после загрузки и распределение все, вы делаете некоторые вычисления по данным

Одним легче шагом будут раздела ваших данных в небольших наборах (200 строк могут быть). Затем вы будете запускать много потоков параллельно (одно соединение по потоку), и каждый поток будет извлекать небольшое количество строк, помещать их в память и вычислять все, что вам нужно (затем освободить неиспользуемую память, которая будет пропорциональна number_of_workers x rows_loaded_by_worker).

Далее вы завершаете процесс, играя на количестве взятых строк (100 - 10000) и количестве параллельных работников.

Обратите внимание, что ваш SQL-запрос должен быть эффективным для извлечения множества меньших наборов данных (т. Е. Использовать EXPLAIN, просто чтобы убедиться, что в нем нет сканирования таблицы, в противном случае такой запрос не удался).