Karfaqen |
сравнить быстродействие, скажем сохраненного update, и написанного строкой в коде |
ИМХО львиную долю времени на выполнение запроса забирают дисковые операции, особенно, если данные в большом объеме таскаются по сети. Поэтому преимуществом в быстродействии сохраненного запроса можно пренебречь, тем более, что (из умных книжек):
- Запрос с использованием VB функций сохраняется нескомпилированным;
- Оптимальный план на момент первого вызова запроса может оказаться не лучшим при увеличении объема данных, изменении индексов, и т.д.
Karfaqen |
Речь о том, что в случае создания временного querydef запрос будет компилированным? Насколько вообще значителен выигрыш во времени |
Вот процедурка, сравнивающая время обработки запросов из родной таблицы в 2-х вариантах по 1000 раз:
Sub TestQuerySpeed()
Dim t(1 To 4) As Single, i As Integer
Dim sSQL As String, db As DAO.Database, qdf As DAO.QueryDef, rst As DAO.Recordset
Const Cycle = 1000
sSQL = "SELECT * FROM TempTable WHERE (((ID)=1));"
Set db = CurrentDb
Set qdf = db.CreateQueryDef("", sSQL)
Set rst = qdf.OpenRecordset
t(1) = Timer
For i = 1 To Cycle
Set rst = qdf.OpenRecordset
Next
t(2) = Timer
t(3) = Timer
For i = 1 To Cycle
Set rst = db.OpenRecordset(sSQL)
Next
t(4) = Timer
MsgBox t(2) - t(1) & vbCrLf & t(4) - t(3)
End Sub
Средний результат: 2,47 сек - 2,55 сек. Т.е. в тепличных условиях использование временного запроса предпочтительнее db.OpenRecordset(sSQL), но на сущую ерунду.
Не знаю, составляет ли qdf оптимальный план (т.е. компилируется), но при его объявлении SQL выражение дерибанится, т.к. его св-во Fields возвращает семейство полей. Т.е. 1 раз против 1000.
Вывод - не стОит этим заморачиваться.