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 行。

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

  1. 我将上述方法调用了 1-5 次,因此显然它创建了 1-5 个连接。如果它变成性能的 10-20 倍重量?(或创建一个全局连接并打开 1 个连接并处理所有连接,然后在最后关闭。)

  2. 数据表呢?任何替代方案。我认为对于这么多行,我需要断开连接的架构。我需要用检索到的数据填充我自己的类对象(或迭代数据读取器并填充List<objects>FetchData() 内部)。

有什么建议么?

4

1 回答 1

3

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

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

  1. 您尝试通过一个网络管道加载大量数据
  2. 然后您尝试将所有大量数据存储在主内存中
  3. 然后在加载和分配所有内容后,对数据进行一些计算

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

接下来,您通过播放获取的行数(100 - 10000)和并行工作人员的数量来微调该过程。

请注意,您的 SQL 查询需要有效地检索许多较小的数据集(即使用EXPLAIN,以确保不涉及表扫描,否则这样的方法将失败)。

于 2012-06-09T11:57:15.230 回答