2012-06-09 26 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,00,000行。C#.Net中的数据表现性能

我需要针对两种情况的建议。

  1. 我把上面的方法调用了1-5次,所以显然它创建了1-5个连接。 如果变成性能的10-20倍?(或创建一个全局连接并打开1个连接,并在最后关闭所有进程。)

  2. datatable怎么样?任何选择。我认为我需要断开连接的体系结构来处理这么多行。我需要用检索到的数据填充我自己的类对象(或者迭代数据读取器,并在FetchData()中填入List<objects>)。

有什么建议吗?

+4

“我需要从数据库中检索近15,00,000条记录。” - 你打算怎么处理它们? –

+1

*有何建议?*如果 - 一次不加载15百万行。你需要做什么?如果可能的话:将处理移动到服务器 - 使用例如处理数据来处理数据。 T-SQL存储过程,并且只返回一个小得多的结果集到你的应用程序 –

+0

@Mitch Wheat:我需要从数据库中检索近15,00,000条记录。“ - 你将如何处理它们。解析器具有与我检索的列有关的属性,我填充该对象并对该对象执行一些操作。现在,我正在迭代数据表并创建对象。 –

回答

2

首先,您可以尝试在数据库中尽可能多地预处理(这就是他们擅长的)。

然后,您将不得不缩小您获取并行操作的数据。让我来解释一些问题在这里:

  1. 你试图通过一个网络管道加载大量数据
  2. 然后尝试
  3. 然后存储在主内存中的所有数据量庞大之后装载和分配的一切,你做的对数据的一些计算

一个更简单的步骤将是分区您在较小的数据集(200行可能)。然后,你将并行运行多个线程(一个线程连接),每个线程将获取少量的行,将它们放入内存并计算任何你想要的数据(然后释放未使用的内存,这将与number_of_workers x rows_loaded_by_worker成比例)。

接下来,通过在获取的行数(100 - 10000)和并行工作器数量上播放来优化进程。

请注意,您的SQL查询需要高效地检索许多较小的数据集(即使用EXPLAIN,只是为了确保没有涉及表扫描,否则这种方法会失败)。