我通过查询大型mysql数据库生成了一个数据表。 这导致了大约7000行。现在我想添加一个列,用于计算“BREAK2”列中每个唯一值的“QUANTITY”列的总和(如'group by')。
示例:
BREAK2 | QUANTITY | COMPUTED
A 10 30
B 20 40
A 10 30
A 20 30
B 20 40
如果我使用
Dim dc As DataColumn = New DataColumn
dc.DataType = System.Type.GetType("System.Double")
dc.ColumnName = "SumQTY"
dt.Columns.Add(dc)
For Each dr As DataRow In DT.Rows
dr("SumQTY") = DT.Compute("Sum(QUANTITY)", "BREAK2 = '" & dr("BREAK2") & "'")
Next
这需要很长时间(在我将其分解前几分钟)。
当我使用名为BRIO的querytool查询相同数据时,我添加了一个公式为“Sum(QUANTITY,BREAK2)”的计算列,得到结果大约需要1秒。
这些方法之间可能有什么区别?
为什么VB.net代码需要这么长时间?
我曾尝试使用LINQ但性能相同。
感谢。 NAS
答案 0 :(得分:0)
这似乎很快
Sub Main
Dim sw = new Stopwatch()
sw.Start()
Dim rnd = new Random()
Dim dt = new DataTable()
dt.Columns.Add("BREAK2", "".GetType())
dt.Columns.Add("QUANTITY", 0.GetType())
dt.Columns.Add("COMPUTED", 0.GetType())
for i = 0 to 7000
dt.Rows.Add("A", rnd.Next(0, 30))
dt.Rows.Add("B", rnd.Next(0, 30))
dt.Rows.Add("C", rnd.Next(0, 30))
dt.Rows.Add("D", rnd.Next(0, 30))
Next
Dim keys As List(Of String) = dt.AsEnumerable() _
.Select(Function(x) x("BREAK2").ToString()) _
.Distinct().ToList()
For Each k in keys
Dim listOfRow = dt.AsEnumerable() _
.Where(Function(x) x.Field(Of String)("BREAK2") = k).ToList()
Dim total = listOfRow.Sum(Function(t) t.Field(Of Integer)("QUANTITY"))
For Each row in listOfRow
row.SetField(Of Integer)("COMPUTED", total)
Next
Next
sw.Stop()
Console.WriteLine(sw.ElapsedMilliseconds)
End Sub
正如我在上面的评论中所说,重新计算数千次的相同价值是愚蠢的。
使用LINQ,您可以提取列BREAK2的唯一值,对键所标识的行子集执行一次总和,然后使用总计设置相同的行子集。
在我的电脑上,这需要最多100毫秒。