请帮助我让我的应用程序更快一点,现在需要永远循环并给我结果。
这是什么im donig: 1.从上传的excel文件加载gridview(这可能是大约300条记录左右) 2.将制造商,型号和序列号与我的MS SQL数据库(约20K记录)进行比较,看是否有匹配。
'find source ID based on make/model/serial No combination.
Dim cSource As New clsSource()
Dim ds As DataSet = cSource.GetSources()
Dim found As Boolean = False
'populate db datatables
Dim dt As DataTable = ds.Tables(0)
Dim rows As Integer = gwResults.Rows.Count()
For Each row As GridViewRow In gwResults.Rows
'move through rows and check data in each row against the dataset
'1 - make
For Each dataRow As DataRow In dt.Rows
found = False
If dataRow("manufacturerName") = row.Cells(1).Text Then
If dataRow("modelName") = row.Cells(2).Text Then
If dataRow("serialNo") = row.Cells(3).Text Then
found = True
End If
End If
End If
'display results
If found Then
lblResults.Text += row.Cells(1).Text & "/" & row.Cells(2).Text & "/" & row.Cells(3).Text & " found"
Else
lblResults.Text += row.Cells(1).Text & "/" & row.Cells(2).Text & "/" & row.Cells(3).Text & " not found "
End If
Next
Next
有没有更好的方法来找到两者之间的匹配?我快死了。
答案 0 :(得分:2)
对于300个gridview行中的每一行,您将循环遍历所有20k数据行。这使得300 * 20k = 600万次循环迭代。难怪你的循环很慢。 : - )
让我建议使用以下算法(伪代码):
For Each gridviewrow
Execute a SELECT statement on your DB with a WHERE clause that compares all three components
If the SELECT statement returns a row
--> found
Else
--> not found
End If
Next
使用此解决方案,您只需要300次循环迭代。在每个循环迭代中,您在数据库上进行SELECT。如果您已正确索引数据库(即,如果您在字段manufacturerName
,modelName
和serialNo
上有复合索引),则此SELECT应该非常快 - 比循环遍历所有20k数据行。
从数学的角度来看,这会将算法的时间复杂度从O(n * m)
降低到O(n * log m)
,n
表示网格视图中的行数和{{1数据库中的记录数。
答案 1 :(得分:1)
虽然海因兹的回答是正确的;在循环之前执行昂贵的SQL查询并使用数据视图进行过滤可能更有利,这样您就不会在DB上进行300次
Execute a SELECT statement on your DB
For Each gridviewrow
if my datagridview.Select(String.format("manufacturerName={0}", row.item("ManufacturerName"))
If the dataview has a row
--> found
Else
--> not found
End If
Next
注意:我只比较了一个标准来说明这一点,你可以在这里过滤所有三个
答案 2 :(得分:0)
嗯...如何将电子表格中的数据加载到tempdb中的表中,然后编写一个select,以比较行的方式来比较它们?这样,所有数据比较都在服务器端进行,您将能够充分利用SQL实例的所有功能。