powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Update отфильтрованного рекордсета - оптимизация
25 сообщений из 28, страница 1 из 2
Update отфильтрованного рекордсета - оптимизация
    #39237382
Volunteer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется табличная форма с большим числом записей, пользователь произвольно фильтрует данные, используя быстрые фильтры табличной формы, затем нужно для всех отобранных записей проапдейтить определенное поле по кнопке. Вопрос: как это сделать, чтобы работало быстро?

Так, для 130 000 отобранных записей процедура апдейта обычным циклом по рекордсету формы (.Edit ... .Update) работает минуту 40 секунд.

Если воспользоваться вот этим способом с ADO detached recordset с последующим UpdateBatch для сохранения первичного ключа во временную таблицу, а затем выполнить update в связке с этой таблицей, то сохранение в цикле работает 1:18 и собсвенно запрос 6 секунд, т.е. быстрее, но не намного.

По идее можно было бы сформировать update с where на базе текста фильтра, но как конфертировать фильтр, содержащий специальный синтаксис для полей с комбобоксами я, честно говоря, не представляю.

Может кто посоветовать способ ускорения?
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39237402
Емнип, акс сам решает - чего и сколько выводить в окошечки, как ты там не изгаляйся. А все эти замеры - пустое.

От себя добавлю, что на чистом коде, без гуя, локально, при не очень сложной математике _только_целочисленных_ данных я разгонял простой рекордсет объемом до 3М записей на последовательном чтении до 30К записей в секунду, на средней паршивости десктопе при минимуме посторонних процессов. Но и то, это когда рекордсет был уже заполнен (was populated) через last-first.

И вот теперь, считай, солдат, где Москва, а где Багдад...
.
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39237475
Volunteer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
капча-реки-я-не-робот,
Не совсем понял, причем тут окошки. Естественно, я не работаю с рекордсетом формы напрямую, использую копию по RecordsetClone. Простой рекордсет, может и будет давать 30К в секунду, но мой на базе таблицы, там в районе 40 полей, большинство цифровые. В форме есть комбобоксы на базе этих полей, но копии рекордсета это должно быть пофиг. Нужно еще поэкспериментировать.
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39237501
VolunteerНе совсем понял, причем тут окошки.
Личные мои наблюдения. Чисто субъективно. Я с формами стараюсь не свзываться. Но, когда приходилось, то все приседания и ужимки натыкаются на внутреннее понимание аксом - чего, когда и сколько выводить на экран. Это легко заметить даже не на форме, а на самой простой, но толстой, таблице. Открой, и обрати внимание по контролам в ее низу - как заполнится ее служебный, невидимый нам, рекордсет. Потом попробуй сделать то же самое, но при этом сразу крутнуть окно, не дожидаясь заполнения.

Предполагаю, что очень-очень давно разрабы взяли на вооружение популярный метод - выплюнуть на экран хоть что-то, а пока юзер вкуривает и чешет репу - заполнить и рекордсет и дисковый кэш (или что там еще?).

Не удивлюсь, что при этом окажется, что для этого финта они используют два запроса - один с числом записей по экранному пространству, а в фоне херачат основной запрос. С них станется...

Если факт наличия некоего "оптимизирующего" механизма налицо, то, скорее всего, этот механизм применяется не только на ИДЕ, но и во всей остальной механике кправления БД.

Ты... этой... тогой... особо не доверяй мне... в данном теоретизировании...

Это все абсолютное ИМО обывателя, не утруждавщего себя исследованием обсуждаемых механизмов. Ну, вот так оно. И ни на какой кривой козе ты это не объедешь... Принимаем как данность.

Если чо, то старшие товарищи меня поправят...
.
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39237524
Может стоит попробовать открыть такой ADODB.Recordset со всеми записями таблицы, в нем искать и редактировать нужные записи?
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39237543
Volunteer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
капча-цветы-я-не-робот,
Да, собственно, чтение рекордсета очень мало влияет на время выполнения. Сейчас проверил, 130К записей последовательно читаются в переменную за 1 секунду. Вопрос в записи изменений.

Анатолий ( Киев ),
Насчет работы с ADODB копией с последующим UpdateBatch я тоже подумал, попробую обязательно и отпишусь, сегодня уже не получится.
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39237587
Volunteer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не выдержал, попробовал. Создал detached ADO recordset на базе ещй же таблицы, проапдейтило поле в 130К записей в этом рекордсере за 8 секунд, а вот выполнение команды UpdateBatch заняло 15 минут (!) так что не вариант.

Есть еще какие-то идеи? Видимо, придется заморичиться с переводом текста фильтра в SQL update...
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39237588
Анатолий ( Киев )Может стоит попробовать открыть такой ADODB [...]
Толик, ты вот многда умные вещи пишешь, а иногда как бзданешь в мешок с мукой...

Какое АДО, если речь идет о скоростях?!

Мне даже неудобно как-то повторяться... Акс читает с диска свой raw-формат. Как-то его пережевывает и лишь в финале выплевывает в АДО или ДАО... Я - смотри пост выше - я ведь просил поправить, если ъуйню спорол. Ты же прошел мимо, словно этого поста не было. А завтра придет мОлодежь, и бросится читать мою чушь...

Аргументируй, плз.
.


Volunteer ,
есть еще и такое наблюдение - скорость практически не зависит от физического носителя. Я ърочился с диском в памяти. Пустое. На уровне погрешности. Акс внутренне очень эффективно, просто поразительно! работает со своим raw-форматом. Про чтение говорим. Запись - там все сложнее. ОЧень сильно влияют третьи процессы, если они, не дай бог, с обращениями к диску.


Бросить базу на пустой быстрый диск, не отягощенный обязательствами к третьим процессам. Все остальное - шаманство с бубном.

Опять же оговорюсь:
- разумные типы данных
- никаких даблов(!!!!!!!!!!!!!!!!!!!!!) - даже время - в лонг
- лишь минимально необходимая для сбора мсходных данных индексация
Никаких
- значений по умолчанию
- форматов
- условий на значение
и т.п..
.

Volunteer130К записей последовательно читаются в переменную за 1 секунду
Отлично. Значит математика у меня была потяжелее, а машина - похуже :)


VolunteerВопрос в записи изменений.
У меня такого на продакшене нет. Но, по наблюдениям, самый ресурсоемкий процесс. Добавление - оно чуть помедленней чтения, но изменение... будет главный тормоз.
.
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39237602
Volunteer,

меня щаз будут бить в пах. И, может, даже ногами :)

еъучая НОРМАЛИЗАЦИЯ :)

Разбей таблицу на две со связью по ИД один-к-одному. В первой части оставь легкие типы данных. Во вторую - все строковые, даблы и прочую шпану. Уверен - лишь интегры требуют изменения с предъявляемыми тобой требованиями по скорости .

Остальная шпана скорости не требует. И не спорь даже...

А уж если действительно не так - тады думай, крокодил, думай.... Над концепцией...
.
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39237616
А так?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Private Sub s_DblClick(Cancel As Integer)
    Dim s$, i&, t#
    Dim r As DAO.Recordset
    Set r = Me.RecordsetClone
    
    t = Timer
    Do Until r.EOF
        i = i + 1
        s = s & r!id & ","
        r.MoveNext
        If i \ 1000 = i / 1000 Then
            s = Left(s, Len(s) - 1)
            s = "update t set s='KKK' where id in (" & s & ")"
            'Если s слишком длинная, то исп. Currentproject
            CurrentProject.Connection.Execute s
            'CurrentDb.Execute s
            s = ""
        End If
    Loop
    If s <> "" Then
        s = Left(s, Len(s) - 1)
        s = "update t set s='KKK' where id in (" & s & ")"
        'Если s слишком длинная, то исп. Currentproject
        CurrentProject.Connection.Execute s
        'CurrentDb.Execute s
    End If

    MsgBox Timer - t
    
End Sub
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39237625
Volunteer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
капча-дорожные знаки-я-не-роботеъучая НОРМАЛИЗАЦИЯ :)


Не думаю. Обычный update .... where ... на этой же таблице работает всего несколько секунд. Но это нативный SQL, а все, что лепится сверху - в десятки раз медленнее получается
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39237651
Volunteer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А так?,

20 секунд на тестовых 130К записей! Отличная идея, это уже вполне приемлемо, спасибо!
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39237676
Volunteer,

* А так?
- Как?

* 20 секунд на тестовых 130К записей!
Код: plaintext
130 \ 20 = 6
Ты уже пошел на уступки этому проклЯтому Аксу :)

* Отличная идея
- Дык... какая? См. первый вопрос...

* спасибо!
- Да не за что :)
Жаль что явного решения не прозвучало :(

Код: plaintext
-------------------------

Ну почему все зациклено на запросе?!
Не понимаю, млин
...
Почему нельзя просто встать на запись и сделать ей фумитокс:
.Fields(sFldNam).Value = longHZ
.Update

Запись будет очень рада, если на все изменения придется лишь один Апдейт.
.
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39237681
капча-дорожные знаки-я-не-робот * А так?
- Как?
Сорри. Не отразил ник. Ну и последующая логика изложения - фтопку...
Сорри.
.
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39237715
* последующая логика изложения - фтопку...
- До отчерка, есно...

--------------------
А этому кадру - "А так?"
Я думал бить будут меня. Ан нет..
Буду бить я тебя. И может даже ногами . И в т.ч. в пах.

Ты уж не обессудь... потерпи, паря...
Я ж не со зла... а из большой любви к правде лишь :)

Ты как хочешь - сразу помереть, или помучаться?

В смысле - каждую строку вот этого шедевра 19185119 отдельным постом разбирать, аль все кучей?
.
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39237722
Volunteer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
капча-деревья-я-не-роботБуду бить я тебя. И может даже ногами . И в т.ч. в пах.


За что бить-то? Человек на коленке накидал вполне работающий код, который, конечно, в нормальное приложение не засунешь, но после окультуривания имен и некоторой небольшой оптимизации будет вполне красиво смотреться и работать. Основная идея - сегментация запросов через in мне очень понтавилась и действительно работает.
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39237727
VolunteerЗа что бить-то?
За что? Я как раз это в черновике и излагаю. Каплю терпения, мой друг.

Да не переживай ты так... буду бить аккуратно, но сильно.
Это у нас такая форма выражения исключительной приязни к собеседнику :)

Бить-то его уже бесполезно. Но показательная порка может другим разгильдяям впрок будет...

Не-не. Ты не подумай - он чаще добротные и пользительные вещи пишет, чем наоборот. Только вот сейчас он жестко окарался.
.
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39237747
А так?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Только вот сейчас он жестко окарался.
Расшифруй.
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39237784
А так?Расшифруй.

в смысле "Пожалуйста"? Или, на худой конец, - "плз"?
Постарайся быть повежливее. Формально, хотя бы.

Я ж тя спрашивал:
Ты как хочешь - сразу помереть, или помучаться?
Что ж ты отмолчался, а щаз предъявы - ну, типо, кагды?
Я мог ужЕ тагды начать построчно выкладывать...

Да и писал выше:
капча-конфеты-я-не-робот Я как раз это в черновике и излагаю. Каплю терпения, мой друг.

Извини. Отвлекли. На пару-тройку внеплановых подходов к снаряду :)

Щаз. Допишу. Выложу.
.
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39238423
А так?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
Private Sub s_DblClick(Cancel As Integer)
    Dim s$, i&, t#
    Dim r As DAO.Recordset
    Dim iArr, j&
    
    iArr = Array(1, 10, 100, 1000, 10000)
    
    For j = 0 To UBound(iArr)
        s = "": i = 0
        Set r = CurrentDb.OpenRecordset("select * from t")
        
        t = Timer
        Do Until r.EOF
            i = i + 1
            s = s & r!id & ","
            r.MoveNext
            If i \ iArr(j) = i / iArr(j) Then
                s = Left(s, Len(s) - 1)
                s = "update t set s='KKK' where id in (" & s & ")"
                'Если s слишком длинная, то исп. Currentproject
                CurrentProject.Connection.Execute s
                'CurrentDb.Execute s
                s = ""
            End If
        Loop
        If s <> "" Then
            s = Left(s, Len(s) - 1)
            s = "update t set s='KKK' where id in (" & s & ")"
            'Если s слишком длинная, то исп. Currentproject
            CurrentProject.Connection.Execute s
            'CurrentDb.Execute s
        End If
    
        'MsgBox Timer - t
        Debug.Print iArr(j), Timer - t
        r.Close: Set r = Nothing
    Next j
    
End Sub


Код: vbnet
1.
2.
3.
4.
5.
 1             104,2578125 
 10            13,3515625 
 100           4,70703125 
 1000          18,75 
 10000         164,65234375 


Модератор: Вложение удалено
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39238506
Модератор: для бесед не по теме топика есть лестница.
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39238521
Mina Anna Mazzini
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я понимаю, что это - самострел...

Под катом весь
черновик на тот момент:
Взглянул на код "А так?"

Ълядь. Это какой-то театр абсурда... Возникает чел со скоростью. Ну, типо, есть у него свон понимание ее. В сферичееских попугаях. В вакууме. И возникает энтузизист с говнокодом (мы про скорость толкуем!). И оба щазтливы... Не укладывается такое в голове...

Построчно разбираю как код, не вдаваясь даже в логику... Прошу - без обид. Взгляд со стороны. Просто я его озвучмл, а остальные промолчали. Вот вас обоих и устраивает это молчание.

--------------
Set r = Me.RecordsetClone
заполнять его дядя будет...


--------------
s = s & r!id & ","

Я, честно, не разбираюсь и не хочу разбираться в этих восклицательных знаках, точках, квадратных скобках и прочих аксовых костылях. Ни разу у меня не было проблем с этим и не будет.

Так что - забей эту конструкцию себе в ... хм... и напмши по-людски:
r.Fields("id").Value

И что получается? Что именно для того мы храним ИД в лонге, чтобы потом загнать его в строку?!!
Конкатенация - самый ресурсоемкий процесс, шоб ты знал...
И это на каждой записи...

--------------
r.MoveNext
Угу... но почему здесь?!

--------------
If i \ 1000 = i / 1000 Then

Это вааще атас...
С открытым сердцем положившись на последовательности компилятора :)
Не судьба, знать, была скобки поставить красоты и читабельности хотя бы для...
Ее говоря уж об однозначности инструкций компилятору.
Будь я компилятором - назло тебе сосчитал бы (i \ (1000 = i) / 1000)
:)

Лана... запишем по-людски: (i \ 1000) = (i / 1000)

Но, из лонга в дабл, безя ывной нужды - это нормально?

Сравнение не явно приводимых типов - это нормально?
Сравнение на равенство не явно приводимых типов - это нормально?
Сравнение на равенство не явно приводимых типов, один из которых с вероятностью 99.9% дабл - это нормально?
НЕ СРАВНИВАЮТСЯ, ЪЛЯЪЬ!, ДАБЛЫ НА РАВЕНСТВО!

Ну и, в целом, разве mod не православен нынче?

Т.е. вся эта непростая трехомудия лишь из того, что мсье не знает слова mod...
А мы о СКОРОСТИ говорим. Никто еще не забыл вводную?


--------------
s = Left(s, Len(s) - 1)
Left в контексте скорости пишется как Left$

Ты для этого шагом выше добавлял запятую, чтобы сразу наччать вычислять (!) длину строки с ней, чтобы потом подрезать строку слева без нее?!!! Две переменных завести - ну ни как не судьба?!


--------------
Len(s) == Int(Log(Abs(s))/Log(10#) + 1)
Предполагаю, что есть и более изящные решения.

Но и даже это от лукавого. Не нужно оно. У нас есть оригинальное s, которое нужно модифицировать по результату отработки if, которое надо загнать в соответствующий тип, и проверять уже его, а не этот высер:

If (s <> "") Then
Ну, снизойди, сжалься, хотя бы до (Len(s) > 0)
Тем более, что мы же все о скорости толкуем ...
Я уж и скобки за тебя ласставляю... да... не царское это дело...


--------------
Закон - если код повторяется два раза и больше - в отдельную процедуру!
Скажется на скорости - тадый ой. Будет исключение из Правил. Застрелишься только документировать...
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39238567
Mina Anna Mazzini
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Модератор: есть лестница для бесед не по теме топика.
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39238625
Volunteer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mina-капча,
Ты, конечно, извини, но твой разбор меня повеселил. Ты говоришь об оптимизации кусков кода, которые дадут прирост скорости в единицы, если не доли процентов, т.к. все, что не касается собственно базы данных работает примерно одинаково на интерпретаторах псевдокода типа Акцеса (медленно, честно говоря, но приемлемо для наших задач). А вот уважаемый автор идеи взял и еще больше чем в 2 раза ускорил обновление, выяснив зависимость скорости от размера кусков деления, за что ему допонительное большое спасибо. Тест на 130К записей работает теперь 7 секунд при делении по на 100 вместо 20 секунд на 1000.
...
Рейтинг: 0 / 0
Update отфильтрованного рекордсета - оптимизация
    #39238652
Mina Anna Mazzini
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Volunteer,

* которые дадут прирост скорости в единицы, если не доли процентов

дурак Вы, Ваше благородие....

Я хотел было сказать это значительно ранее, когда ты начал было сравнивать. Но поскромничал.
Я тут пишу Оле трактат о том, как бабло давит идею :)

Слово "оптимизация" произнес не я, а ты. Если б ты это озвучил, как "оптимизация на два сферических попугая в вакууме" я или бы послал тебя сразу, или бы просто промолчал.


* работает примерно одинаково на интерпретаторах псевдокода
- Ты только в других местах это вслух не произноси. От греха :)
Сам то зацени - "примерно одинаково"
Ни чо в душе программиста не восстает против?

Примерно
Одинаково

Зацени, как программист, этот каламбур :)

* в 2 раза ускорил обновление, выяснив зависимость скорости от размера кусков деления, за что ему допонительное большое спасибо
- Двумя руками с тобой и искренне рад за тебя и в пах мне два раза если лукавлю..
Но... хоть в 22. Это ведь случай... пытаясь разобрать - читай ПОНЯТЬ-СПРОГНОЗИРОВАТЬ-СМАСШТАБИРОВАТЬ-РАЗМНОЖИТЬ который, мы упремся опять в непредсказуемые механизмы акса и его работы с дисковым кешем.... Даешь на пятаки, что в другом операционном окружении тот же косарь прокатит? А, может, наоборот - ЗАТОРМОЗИТ. Дашь ты мне общую рекомендацию на размер этого шага?

К чему это я? А к тому, что ты лишь за частный случай гутаришь, за собственный. А я - за общий подход. Ты из своих радостей ничего другим не присоветуешь, в то время, как мои заметки имеют ценность абсолютную. Скажи - в каком из сових постулатов я неправ. Поправь. А то ты тут лишь попугаями козыряешь...

Не, если ты мне приподнимешь веки - я буду весь твой и твоего консультанта.
В своей задаче я организовал "свой" (мы ж не баре) кеш фифо в памяти акса. От балды назначил сто записей. Потом флэш на диск.

Но вся жопа в том, что данные-то у меня летят в рилтайме. Что ты мне присоветуешь, исходя из полученного тобой от консультанта опыта? Ни. Че. Го.

Тогда как мои рекомедации реально ОПТИМИЗИРУЮТ задачу в тактах процессора, а не в тових... сферических... блин, с кем я опять связался....

Забудь про попугаев и подчеркни - где в моей критике я был неправ.
.


.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Update отфильтрованного рекордсета - оптимизация
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]