У меня была программа, которая работала нормально. Но я хочу увеличить скорость работы моей программы.
Старый код выглядит примерно так:
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 стоит больше, чем новый запрос. Есть ли лучший метод, который я могу пройти по таблице с указанием значения ключа?
Большое спасибо.