编辑大型数据表性能问题
本文关键字:问题 性能 数据表 大型 编辑 | 更新日期: 2023-09-27 18:31:39
我有一个包含大约 100k 条记录的数据表。数据表具有多个包含一些整数值的列。我需要添加这些整数值并将其写入第 Total Count
列并Common Count
.我使用以下代码,但大约需要 10-15 秒。我怎样才能以有效的方式做到这一点?
编辑的零件开始
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();
已编辑部分已结束
在这里,我编辑这个可访问的内容,然后在最后绑定到网格视图
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
}
想办法替换
int.Parse(drow[i].ToString());
直接铸造:
(int)drow[i];
如果单元格值中已经没有整数,请尽您所能将它们放在那里。
除此之外 - 注意可能由于列值更新而触发的任何事件 - 也许这就是减慢您的速度的原因。
另一个想法:使用 SQL 计算列值!
我建议不要在 c# 中执行如此繁重的任务,而是从 sql Server 返回此计算值(尝试在存储过程中操作此繁重数据)并返回计算值。
您可以在 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() 调用。试试这个:
取代
nTotalCount += int.Parse(drow[i].ToString());
if (int.Parse(drow[i].ToString()) != 0)
{
nCommonCount += 1;
}
有了这个
var val = Convert.ToInt32(drow[i]);
if(val != 0)
{
nTotalCount += val;
nCommonCount++;
}