vb.net кэширование таблиц базы данных

#mysql #vb.net #recordset

#mysql #vb.net #набор записей

Вопрос:

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

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

 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=" amp; 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=" amp; 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=" amp; 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=" amp; 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
  

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

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

Ответ №1:

Вы могли бы выполнить один объединенный запрос, например:

 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 = " amp; ClassGroup)
    Do While Not rsStudent.EOF
        DoSomethingOnStudent(rsStudent.fields.item("StudentID").value)
        rsStudent.movenext
    Loop
End Sub
  

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

Комментарии:

1. Боюсь, я не могу этого сделать. Я пытаюсь упростить свою ситуацию, но, похоже, я сделал ее слишком простой. Я должен был повторно задать свой вопрос…..

2. Вероятно, вы можете увеличить Filter производительность, используя индексы. Смотрите раздел Оптимизация свойств-Динамическая (ADO) при условии, что вы запрашиваете источник данных SQL Server. Я все равно никогда не пользовался таким свойством.

3. Я пока не смог выяснить, как это сделать на ADODB, но я считаю, что это хорошее направление. Я буду продолжать находить ответ. Спасибо.