Home Articles

编辑大型数据表性能问题

Asked
Viewed 632 times
0

我有一个大约有10万条记录的数据表 . Datatable有多个包含一些整数值的列 . 我需要添加这些整数值并将其写入 Total CountCommon Count 列 . 我使用以下代码,但大约需要10-15秒 . 我怎么能以有效的方式做到这一点?

Edited Part Start

cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@pudTowerList", SqlDbType.VarChar, 8000).Value = cellId;
cmd.Parameters.Add("@pudTowerCol", SqlDbType.VarChar, 8000).Value = cellIdCol;
sqlCon.Open();
SqlDataReader dr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(dr);
SqlCon.Close();
cmd.Dispose();

Edited Part Ended

在这里,我编辑这个数据,然后在最后绑定到gridview

foreach (DataRow drow in dt.Rows)
   {
      int nTotalCount = 0;
      int nCommonCount = 0;
      for (int i = 2; i < nColumnCount; i++)
      {
         nTotalCount += int.Parse(drow[i].ToString());
         if (int.Parse(drow[i].ToString()) != 0)
         {
            nCommonCount += 1;
         }
      }
       drow["Total Count"] = nTotalCount; // On commenting this lines it runs fast
       drow["Common Count"] = nCommonCount; // On commenting this lines it runs fast
    }

3 Answers

  • 0

    找到一种替代方法

    int.Parse(drow[i].ToString());
    

    直接铸造:

    (int)drow[i];
    

    如果你已经没有单元格值的整数,那么尽你所能将它们放在那里 .

    除此之外 - 请注意由于列值更新而可能触发的任何事件 - 也许这会减慢您的速度 .

    另一个想法:使用SQL来计算列值!

  • 0

    我建议不要在c#中执行如此繁重的任务,而是从sql server自己返回这个计算值(尝试在存储过程中操纵这个重数据)并返回计算值 .

  • 0

    您可以在SQL中计算,而不是使用C#进行计算,如下所示:

    SELECT Id,Col1,Col2,Col3, 
    Col1+Col2+Col3 as TotalCount,
    SIGN(Col1)+SIGN(Col2)+SIGN(Col3) as CommonCount
    FROM test.SO1;
    

    如果您必须使用C#,我建议立即改进,用一个Convert()调用替换两个Parse()调用 . 您还将避免两个ToString()调用 . 试试这个:

    REPLACE

    nTotalCount += int.Parse(drow[i].ToString());
    if (int.Parse(drow[i].ToString()) != 0)
    {
        nCommonCount += 1;
    }
    

    WITH THIS

    var val = Convert.ToInt32(drow[i]);
    if(val != 0)
    {
        nTotalCount += val;
        nCommonCount++;
    }
    

Related