vb.net缓存数据库表

问题描述 投票:0回答:1

我有一个运行良好的程序。但我想加快程序的运行速度。

旧代码是这样的:

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次将浪费时间,所以我尝试缓存整个表并使用Filter查找相关的行:

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方法比新查询花费的时间更长。有没有更好的方法可以循环使用指定值键的表?

非常感谢你。

mysql vb.net recordset
1个回答
0
投票

您可以执行单个连接查询,如下所示:

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

这样,只查询一次DB,执行速度会更快。如果可能的话,还要避免在select子句中使用*,并且只检索你需要的列(我看你只使用表中的StudentID列)。

© www.soinside.com 2019 - 2024. All rights reserved.