таблицы кэширования базы данных vb.net - PullRequest
0 голосов
/ 12 марта 2019

У меня была программа, которая работала нормально. Но я хочу увеличить скорость работы моей программы.

Старый код выглядит примерно так:

Public Funtion CalcSomething(Byval IncID as int16) as double
    Dim rs as adodb.recordset()=cn.execute("SELECT A,B,C,D,.....(around 10 values) FROM table1 t1 LEFT JOIN table2 t2 ON t1.A=t2.A LEFT JOIN ………………(around 10 tables join together WHERE t1.ID=" & IncID)
    Dim Cost1 as double = rs.fields.item("B").value
    Dim AryCost2(19) as double
    For i as int16=0 to 19
        AryCost2(I)=GetCost2(rsX,i,rs.fields.item("A").value,rs.fields.item("C").value)            
    Next I
    Dim Cost2 as double = GetMinValue(AryCost2)

    Return Cost1 + Cost2 
End function

Public Function GetCost2(ByVal I as int16,ByVal A as int16,ByVal B as int16) as double
    Value=DoSomeCalculate(I,A,B)
    Dim rs as adodb.recordset()=cn.execute("SELECT X FROM tableX WHERE Value=" & Value)
    Do while Not rs.EOF
        if FindSuitableOne(rs.fields.item("X").value) then
            Return rs.fields.item("X").value
        End if
    rs.movenext()
    Loop
    return -1
end function

Я думал, что получение значения из tableX 20 раз будет пустой тратой времени, поэтому я пытаюсь кэшировать всю таблицу и использовать фильтр, чтобы найти соответствующие строки:

Public Funtion CalcSomething(Byval IncID as int16) as double
    Dim rs as adodb.recordset()=cn.execute("SELECT A,B,C,D,.....(around 10 values) FROM table1 t1 LEFT JOIN table2 t2 ON t1.A=t2.A LEFT JOIN ………………(around 10 tables join together WHERE t1.ID=" & IncID)
    \\Cache whole table into rsX
    Dim rsX as adodb.recordset()=cn.execute("SELECT X FROM tableX")
    Dim Cost1 as double = rs.fields.item("B").value
    Dim AryCost2(19) as double
    For i as int16=0 to 19
        AryCost2(I)=GetCost2(rsX,i,rs.fields.item("A").value,rs.fields.item("C").value)            
    Next I
    Dim Cost2 as double = GetMinValue(AryCost2)
    Return Cost1 + Cost2 
End function

Public Function GetCost2(byval rsX as adodb.recordset,ByVal I as int16,ByVal A as int16,ByVal B as int16) as double
    Value=DoSomeCalculate(I,A,B)
    rsX.Filter="Value=" & Value) <----this step takes even longer than a new query, I want to ask if there 
    Do while Not rsX.EOF
        if FindSuitableOne(rsX.fields.item("X").value) then
            Return rsX.fields.item("X").value
        End if
    rsX.movenext()
    Loop
    return -1
end function

Но я обнаружил, что метод Filter стоит больше, чем новый запрос. Есть ли лучший метод, который я могу пройти по таблице с указанием значения ключа?

Большое спасибо.

1 Ответ

0 голосов
/ 12 марта 2019

Вы можете сделать один присоединенный запрос, например:

Public Sub DoSomething(Byval ClassGroup as int16)
    Dim rsStudent as adodb.recordset()

    rsStudent=cn.execute("SELECT tblStudent.StudentID FROM tblStudent INNER JOIN tblClass ON tblStudent.ClassID = tblClass.ClassID WHERE tblClass.ClassGroup = " & ClassGroup)
    Do While Not rsStudent.EOF
        DoSomethingOnStudent(rsStudent.fields.item("StudentID").value)
        rsStudent.movenext
    Loop
End Sub

Таким образом, запрашивая БД только один раз, ваше выполнение должно быть быстрее. Также по возможности избегайте использования * в предложении select и извлекайте только те столбцы, которые вам нужны (я вижу, вы используете только столбец StudentID из таблицы).

...