Как сделать for l oop быстрее при сравнении строк gridview с базой данных? - PullRequest
1 голос
/ 17 июня 2020

Я получаю набор из более чем 40 тысяч записей. Требуется выделить в таблице записи, которые существуют или не существуют в нашей базе данных.

Итак, мы выбрали каждую запись и сравнили с таблицей базы данных с помощью процедуры.

If exists(Select FunctionalLocation from EngineeringData where
                 FunctionalLocation = @Asset_Number 
)
Begin
                 Select 1
End

                 Else
Begin                

                 Select 0
End


END

но это занимает так много времени, а иногда и таймаут.

Можно ли каким-либо образом оптимизировать этот код?

For k = 0 To gv_InfoFunctionalLocation.Rows.Count - 1

    If k < 50000 Then    ' to test only

        Dim row = gv_InfoFunctionalLocation.Rows(k)

        Dim RowEffect As Integer
        Dim dSetReturn As New DataSet
        ParamValue(0) = row.Cells(1).Text
        ParamValue(1) = row.Cells(4).Text
        dSetReturn = Func.SP_ReturnDataset(con, "[dbo].[USP_Check_FunctionalLocations]", True, ParamName, ParamType, ParamValue)
        RowEffect = dSetReturn.Tables(0).Rows(0).Item(0)
        Dim gRow As GridViewRow = gv_InfoFunctionalLocation.Rows(k)
        Dim cBox As CheckBox = CType(gRow.FindControl("chkSelect"), CheckBox)

        If RowEffect = 0 Then
            'dtFL.Rows(k).Cells("Status").Value = True
            'dtFL.Rows(k).ReadOnly = True
            gv_InfoFunctionalLocation.Rows(k).BackColor = System.Drawing.Color.Tomato
            cBox.Checked = True

        Else

            gv_InfoFunctionalLocation.Rows(k).BackColor = System.Drawing.Color.YellowGreen
            cBox.Checked = False

        End If

        If cBox.Checked = True Then
            btnImportFL.Enabled = True
            btnImportFL.BackColor = Drawing.Color.Navy
        End If
    End If

Next

Есть ли быстрое решение, поскольку у нас мало времени и ресурсов?

1 Ответ

0 голосов
/ 17 июня 2020

Если набор данных в базе данных значительно превышает 40 КБ, массовая загрузка значений идентификаторов данных в базу данных (временную таблицу), а затем внутреннее соединение с ней, чтобы загрузить только набор идентификаторов, уже находящихся в базе данных. Загрузите результаты запроса в HashSet

В противном случае, если набор данных db не превышает 40 КБ, просто загрузите каждый идентификатор в db и загрузите их в HashSet,

В любом случае теперь вы можете перебирать данные, запрашивая хэш-набор, присутствует ли идентификатор

...