#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, но я считаю, что это хорошее направление. Я буду продолжать находить ответ. Спасибо.