|
оригинальный Dlookup
|
|||
---|---|---|---|
#18+
Обнаружилось что Dlast в ADP работает не так как в mdb т.е. выбирает не последнюю введенную запись , по крайней мере не всегда. в процессе копания откопал следущее: 3-я переменная действительно полностью поддерживает синтаксис WHERE - в том числе и подчиненные запросы. Что выполняется гораздо быстрее чем один dlookup вложенный в другой. DLookup("code", "project", "[counter] = (select max(counter) from project where client = " & Me.ПолеСоСписком38 & ")") мне это показалось прикольным kozin@mail.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2002, 09:28 |
|
оригинальный Dlookup
|
|||
---|---|---|---|
#18+
А что считать последней записью если явно не указан Order? Сервер может вернуть записи ьез явной сортировки в любом порядке. Мой совет - забудб про Dlookup. Он в ряде случаев страшно тормозит. Лучше пропиши свою маленькую, оптимизированную под конкретный случай функцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2002, 09:59 |
|
оригинальный Dlookup
|
|||
---|---|---|---|
#18+
в данном случае - max(counter)- где counter поле счетчика и есть заменитель orderby аналогично можно и по другим полям dlookup действительно медленная функция но если она запускается не в цикле а используется для одноразового запуска то не играет роли сколько она выполняется 0,1 сек или 0,0001 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2002, 11:31 |
|
оригинальный Dlookup
|
|||
---|---|---|---|
#18+
>Мой совет - забудб про Dlookup Так категорично не надо говорить. Чтобы вернуть одно значение в VBA, для него это в самый раз, чем открывать запрос. Dlookup вернет быстрее. Надо все проверять. Для одних случаев подойдет рекордсет, для других можно обойтись встроенными функциями. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2002, 08:59 |
|
оригинальный Dlookup
|
|||
---|---|---|---|
#18+
2 ДиД >Так категорично не надо говорить. Чтобы вернуть одно значение в VBA, для него это в самый раз, чем открывать запрос. А как ты думаешь каким способом Dlookup вытягивает данные с сервера? Или приведи пример, в котором Dlookup отработает быстрее нормально подготовленной ADODB.Command? Категорично утверждал, утверждаю и буду утверждать что Dlookup это вредное наследие mdb пока на фактах мне не докажут обратное. Пока факты говорят в пользу соего утверждения. Как ты правильно сказал "Надо все проверять." Вот и проверь. Я это уже проделывал. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2002, 02:18 |
|
оригинальный Dlookup
|
|||
---|---|---|---|
#18+
Я уже проделывал. Засекал время. Использовал функцию TimeGetTime() из библиотеки winmm.dll. в большинстве случаев dlookup был быстрее. И это не "вредное наследие mdb". Я Вам доказывать ничего не буду: мне платят не за разговоры. Проверяйте, засекайте, пробуйте. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2002, 06:24 |
|
оригинальный Dlookup
|
|||
---|---|---|---|
#18+
Давно хотелось поиметь статистику быстродействия функций VB . стндартным способом winmm.dll(через референсес)библиотека не подключается... говорит что несовметима с VB. Не подкинешь код скоростемера? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2002, 09:41 |
|
оригинальный Dlookup
|
|||
---|---|---|---|
#18+
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 раза. ЭТО ВРЕДНОЕ НАСЛЕДИЕ. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2002, 10:33 |
|
|
start [/forum/topic.php?fid=45&msg=32026264&tid=1683638]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
192ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
2ms |
others: | 248ms |
total: | 527ms |
0 / 0 |