循环运行很慢

时间:2011-04-20 13:40:46

标签: sql-server vb.net gridview loops

请帮助我让我的应用程序更快一点,现在需要永远循环并给我结果。

这是什么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

有没有更好的方法来找到两者之间的匹配?我快死了。

3 个答案:

答案 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。如果您已正确索引数据库(即,如果您在字段manufacturerNamemodelNameserialNo上有复合索引),则此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实例的所有功能。