АлексейК
Дата: 25.03.2002 09:28:07
Обнаружилось что Dlast в ADP работает не так как в mdb т.е. выбирает не последнюю введенную запись , по крайней мере не всегда.
в процессе копания откопал следущее:
3-я переменная действительно полностью поддерживает синтаксис WHERE - в том числе и подчиненные запросы. Что выполняется гораздо быстрее чем один dlookup вложенный в другой.
DLookup("code", "project", "[counter] = (select max(counter) from project where client = " & Me.ПолеСоСписком38 & ")")
мне это показалось прикольным
kozin@mail.ru
SysOp
Дата: 25.03.2002 09:59:56
А что считать последней записью если явно не указан Order? Сервер может вернуть записи ьез явной сортировки в любом порядке. Мой совет - забудб про Dlookup. Он в ряде случаев страшно тормозит. Лучше пропиши свою маленькую, оптимизированную под конкретный случай функцию.
АлексейК
Дата: 25.03.2002 11:31:01
в данном случае - max(counter)- где counter поле счетчика и есть заменитель orderby аналогично можно и по другим полям
dlookup действительно медленная функция но если она запускается не в цикле а используется для одноразового запуска то не играет роли сколько она выполняется 0,1 сек или 0,0001
ДиД.
Дата: 26.03.2002 08:59:35
>Мой совет - забудб про Dlookup
Так категорично не надо говорить. Чтобы вернуть одно значение в VBA, для него это в самый раз, чем открывать запрос. Dlookup вернет быстрее. Надо все проверять. Для одних случаев подойдет рекордсет, для других можно обойтись встроенными функциями.
SysOp
Дата: 27.03.2002 02:18:13
2 ДиД
>Так категорично не надо говорить. Чтобы вернуть одно значение в VBA, для него это в самый раз, чем открывать запрос.
А как ты думаешь каким способом Dlookup вытягивает данные с сервера? Или приведи пример, в котором Dlookup отработает быстрее нормально подготовленной ADODB.Command? Категорично утверждал, утверждаю и буду утверждать что Dlookup это вредное наследие mdb пока на фактах мне не докажут обратное. Пока факты говорят в пользу соего утверждения. Как ты правильно сказал "Надо все проверять." Вот и проверь. Я это уже проделывал.
ДиД.
Дата: 27.03.2002 06:24:07
Я уже проделывал. Засекал время. Использовал функцию TimeGetTime() из библиотеки winmm.dll.
в большинстве случаев dlookup был быстрее. И это не "вредное наследие mdb". Я Вам доказывать ничего не буду: мне платят не за разговоры. Проверяйте, засекайте, пробуйте.
АлексейК
Дата: 27.03.2002 09:41:26
Давно хотелось поиметь статистику быстродействия функций VB .
стндартным способом winmm.dll(через референсес)библиотека не подключается... говорит что несовметима с VB.
Не подкинешь код скоростемера?
SysOp
Дата: 27.03.2002 10:33:17
2ДиД
>Я уже проделывал. Засекал время. Использовал функцию TimeGetTime() из библиотеки winmm.dll.
Ты бы еще к серверу точного времени обратился. Тогда вааще круто и неоспоримо...
>в большинстве случаев dlookup был быстрее. И это не "вредное наследие mdb". Я Вам доказывать ничего не буду: мне платят не за разговоры. Проверяйте, засекайте, пробуйте
Мне тоже не за чтение детективов деньги платят. Поэтому позволь усомниться в твоей компетентности и привести результат простенького теста:
Dim t As Single, i As Variant, j As Long, cmd As ADODB.Command, rs As ADODB.Recordset
'Ваш любимый Dlookup по таблице в 300000 записей
t = Timer()
For j = 200000 To 201000
i = DLookup("Event_id", "dbo.EventsContents", "Event_content_id = " & j)
Next
MsgBox Timer() - t
'8.5 секунд
'Вариант с командой и рекордсетом (обратите внимание что каждый раз создается и убивается и команда и рекордсет!)
t = Timer()
For j = 200000 To 201000
Set cmd = New ADODB.Command
cmd.ActiveConnection = CurrentProject.Connection
cmd.CommandText = "SELECT Event_id FROM dbo.EventsContents WHERE Event_content_id = " & j
cmd.CommandType = adCmdText
Set rs = cmd.Execute
i = rs("Event_id")
rs.Close
Set rs = Nothing
Set cmd = Nothing
Next
MsgBox Timer() - t
'3.1 секунды
'Вариант с сохраненной процедурой:
'Create Procedure sp_test @Event_content_id Int Output As
'Select @Event_content_id = Event_id From dbo.EventsContents Where Event_content_id = @Event_content_id
'Return
t = Timer()
For j = 200000 To 201000
Set cmd = New ADODB.Command
cmd.ActiveConnection = CurrentProject.Connection
cmd.CommandText = "sp_test"
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Append cmd.CreateParameter("@Event_content_id", adInteger, adParamInputOutput, , j)
cmd.Execute
i = cmd.Parameters(0)
Set cmd = Nothing
Next
MsgBox Timer() - t
'2.5 секунды
'И наконец вариант когда в цикле только присваивается и возвращается значение параметра
t = Timer()
Set cmd = New ADODB.Command
cmd.ActiveConnection = CurrentProject.Connection
cmd.CommandText = "sp_test"
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Append cmd.CreateParameter("@Event_content_id", adInteger, adParamInputOutput)
For j = 200000 To 201000
cmd.Parameters(0) = j
cmd.Execute
i = cmd.Parameters(0)
Next
Set cmd = Nothing
MsgBox Timer() - t
'1.15 секунды
Таким обоазом Dlookup проигрывает по скорости от 2.7 до 7.4 раза.
ЭТО ВРЕДНОЕ НАСЛЕДИЕ.
ДиД.
Дата: 28.03.2002 09:58:46
Вредное наследие.