|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
Имеется табличная форма с большим числом записей, пользователь произвольно фильтрует данные, используя быстрые фильтры табличной формы, затем нужно для всех отобранных записей проапдейтить определенное поле по кнопке. Вопрос: как это сделать, чтобы работало быстро? Так, для 130 000 отобранных записей процедура апдейта обычным циклом по рекордсету формы (.Edit ... .Update) работает минуту 40 секунд. Если воспользоваться вот этим способом с ADO detached recordset с последующим UpdateBatch для сохранения первичного ключа во временную таблицу, а затем выполнить update в связке с этой таблицей, то сохранение в цикле работает 1:18 и собсвенно запрос 6 секунд, т.е. быстрее, но не намного. По идее можно было бы сформировать update с where на базе текста фильтра, но как конфертировать фильтр, содержащий специальный синтаксис для полей с комбобоксами я, честно говоря, не представляю. Может кто посоветовать способ ускорения? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 13:46 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
Емнип, акс сам решает - чего и сколько выводить в окошечки, как ты там не изгаляйся. А все эти замеры - пустое. От себя добавлю, что на чистом коде, без гуя, локально, при не очень сложной математике _только_целочисленных_ данных я разгонял простой рекордсет объемом до 3М записей на последовательном чтении до 30К записей в секунду, на средней паршивости десктопе при минимуме посторонних процессов. Но и то, это когда рекордсет был уже заполнен (was populated) через last-first. И вот теперь, считай, солдат, где Москва, а где Багдад... . ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 14:06 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
капча-реки-я-не-робот, Не совсем понял, причем тут окошки. Естественно, я не работаю с рекордсетом формы напрямую, использую копию по RecordsetClone. Простой рекордсет, может и будет давать 30К в секунду, но мой на базе таблицы, там в районе 40 полей, большинство цифровые. В форме есть комбобоксы на базе этих полей, но копии рекордсета это должно быть пофиг. Нужно еще поэкспериментировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 15:05 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
VolunteerНе совсем понял, причем тут окошки. Личные мои наблюдения. Чисто субъективно. Я с формами стараюсь не свзываться. Но, когда приходилось, то все приседания и ужимки натыкаются на внутреннее понимание аксом - чего, когда и сколько выводить на экран. Это легко заметить даже не на форме, а на самой простой, но толстой, таблице. Открой, и обрати внимание по контролам в ее низу - как заполнится ее служебный, невидимый нам, рекордсет. Потом попробуй сделать то же самое, но при этом сразу крутнуть окно, не дожидаясь заполнения. Предполагаю, что очень-очень давно разрабы взяли на вооружение популярный метод - выплюнуть на экран хоть что-то, а пока юзер вкуривает и чешет репу - заполнить и рекордсет и дисковый кэш (или что там еще?). Не удивлюсь, что при этом окажется, что для этого финта они используют два запроса - один с числом записей по экранному пространству, а в фоне херачат основной запрос. С них станется... Если факт наличия некоего "оптимизирующего" механизма налицо, то, скорее всего, этот механизм применяется не только на ИДЕ, но и во всей остальной механике кправления БД. Ты... этой... тогой... особо не доверяй мне... в данном теоретизировании... Это все абсолютное ИМО обывателя, не утруждавщего себя исследованием обсуждаемых механизмов. Ну, вот так оно. И ни на какой кривой козе ты это не объедешь... Принимаем как данность. Если чо, то старшие товарищи меня поправят... . ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 15:29 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
Может стоит попробовать открыть такой ADODB.Recordset со всеми записями таблицы, в нем искать и редактировать нужные записи? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 15:46 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
капча-цветы-я-не-робот, Да, собственно, чтение рекордсета очень мало влияет на время выполнения. Сейчас проверил, 130К записей последовательно читаются в переменную за 1 секунду. Вопрос в записи изменений. Анатолий ( Киев ), Насчет работы с ADODB копией с последующим UpdateBatch я тоже подумал, попробую обязательно и отпишусь, сегодня уже не получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 15:54 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
Не выдержал, попробовал. Создал detached ADO recordset на базе ещй же таблицы, проапдейтило поле в 130К записей в этом рекордсере за 8 секунд, а вот выполнение команды UpdateBatch заняло 15 минут (!) так что не вариант. Есть еще какие-то идеи? Видимо, придется заморичиться с переводом текста фильтра в SQL update... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 16:45 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
Анатолий ( Киев )Может стоит попробовать открыть такой ADODB [...] Толик, ты вот многда умные вещи пишешь, а иногда как бзданешь в мешок с мукой... Какое АДО, если речь идет о скоростях?! Мне даже неудобно как-то повторяться... Акс читает с диска свой raw-формат. Как-то его пережевывает и лишь в финале выплевывает в АДО или ДАО... Я - смотри пост выше - я ведь просил поправить, если ъуйню спорол. Ты же прошел мимо, словно этого поста не было. А завтра придет мОлодежь, и бросится читать мою чушь... Аргументируй, плз. . Volunteer , есть еще и такое наблюдение - скорость практически не зависит от физического носителя. Я ърочился с диском в памяти. Пустое. На уровне погрешности. Акс внутренне очень эффективно, просто поразительно! работает со своим raw-форматом. Про чтение говорим. Запись - там все сложнее. ОЧень сильно влияют третьи процессы, если они, не дай бог, с обращениями к диску. Бросить базу на пустой быстрый диск, не отягощенный обязательствами к третьим процессам. Все остальное - шаманство с бубном. Опять же оговорюсь: - разумные типы данных - никаких даблов(!!!!!!!!!!!!!!!!!!!!!) - даже время - в лонг - лишь минимально необходимая для сбора мсходных данных индексация Никаких - значений по умолчанию - форматов - условий на значение и т.п.. . Volunteer130К записей последовательно читаются в переменную за 1 секунду Отлично. Значит математика у меня была потяжелее, а машина - похуже :) VolunteerВопрос в записи изменений. У меня такого на продакшене нет. Но, по наблюдениям, самый ресурсоемкий процесс. Добавление - оно чуть помедленней чтения, но изменение... будет главный тормоз. . ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 16:45 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
Volunteer, меня щаз будут бить в пах. И, может, даже ногами :) еъучая НОРМАЛИЗАЦИЯ :) Разбей таблицу на две со связью по ИД один-к-одному. В первой части оставь легкие типы данных. Во вторую - все строковые, даблы и прочую шпану. Уверен - лишь интегры требуют изменения с предъявляемыми тобой требованиями по скорости . Остальная шпана скорости не требует. И не спорь даже... А уж если действительно не так - тады думай, крокодил, думай.... Над концепцией... . ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 16:57 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 17:06 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
капча-дорожные знаки-я-не-роботеъучая НОРМАЛИЗАЦИЯ :) Не думаю. Обычный update .... where ... на этой же таблице работает всего несколько секунд. Но это нативный SQL, а все, что лепится сверху - в десятки раз медленнее получается ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 17:14 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
А так?, 20 секунд на тестовых 130К записей! Отличная идея, это уже вполне приемлемо, спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 17:31 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
Volunteer, * А так? - Как? * 20 секунд на тестовых 130К записей! Код: plaintext
* Отличная идея - Дык... какая? См. первый вопрос... * спасибо! - Да не за что :) Жаль что явного решения не прозвучало :( Код: plaintext
Ну почему все зациклено на запросе?! Не понимаю, млин ... Почему нельзя просто встать на запись и сделать ей фумитокс: .Fields(sFldNam).Value = longHZ .Update Запись будет очень рада, если на все изменения придется лишь один Апдейт. . ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 17:51 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
капча-дорожные знаки-я-не-робот * А так? - Как? Сорри. Не отразил ник. Ну и последующая логика изложения - фтопку... Сорри. . ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 17:55 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
* последующая логика изложения - фтопку... - До отчерка, есно... -------------------- А этому кадру - "А так?" Я думал бить будут меня. Ан нет.. Буду бить я тебя. И может даже ногами . И в т.ч. в пах. Ты уж не обессудь... потерпи, паря... Я ж не со зла... а из большой любви к правде лишь :) Ты как хочешь - сразу помереть, или помучаться? В смысле - каждую строку вот этого шедевра 19185119 отдельным постом разбирать, аль все кучей? . ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 18:50 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
капча-деревья-я-не-роботБуду бить я тебя. И может даже ногами . И в т.ч. в пах. За что бить-то? Человек на коленке накидал вполне работающий код, который, конечно, в нормальное приложение не засунешь, но после окультуривания имен и некоторой небольшой оптимизации будет вполне красиво смотреться и работать. Основная идея - сегментация запросов через in мне очень понтавилась и действительно работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 19:08 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
VolunteerЗа что бить-то? За что? Я как раз это в черновике и излагаю. Каплю терпения, мой друг. Да не переживай ты так... буду бить аккуратно, но сильно. Это у нас такая форма выражения исключительной приязни к собеседнику :) Бить-то его уже бесполезно. Но показательная порка может другим разгильдяям впрок будет... Не-не. Ты не подумай - он чаще добротные и пользительные вещи пишет, чем наоборот. Только вот сейчас он жестко окарался. . ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 19:21 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
Только вот сейчас он жестко окарался. Расшифруй. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 20:19 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
А так?Расшифруй. в смысле "Пожалуйста"? Или, на худой конец, - "плз"? Постарайся быть повежливее. Формально, хотя бы. Я ж тя спрашивал: Ты как хочешь - сразу помереть, или помучаться? Что ж ты отмолчался, а щаз предъявы - ну, типо, кагды? Я мог ужЕ тагды начать построчно выкладывать... Да и писал выше: капча-конфеты-я-не-робот Я как раз это в черновике и излагаю. Каплю терпения, мой друг. Извини. Отвлекли. На пару-тройку внеплановых подходов к снаряду :) Щаз. Допишу. Выложу. . ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2016, 22:17 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
Код: 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.
Код: vbnet 1. 2. 3. 4. 5.
Модератор: Вложение удалено ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2016, 16:11 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
Модератор: для бесед не по теме топика есть лестница. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2016, 17:27 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
Я понимаю, что это - самострел... Под катом весь черновик на тот момент: Взглянул на код "А так?" Ълядь. Это какой-то театр абсурда... Возникает чел со скоростью. Ну, типо, есть у него свон понимание ее. В сферичееских попугаях. В вакууме. И возникает энтузизист с говнокодом (мы про скорость толкуем!). И оба щазтливы... Не укладывается такое в голове... Построчно разбираю как код, не вдаваясь даже в логику... Прошу - без обид. Взгляд со стороны. Просто я его озвучмл, а остальные промолчали. Вот вас обоих и устраивает это молчание. -------------- 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) Тем более, что мы же все о скорости толкуем ... Я уж и скобки за тебя ласставляю... да... не царское это дело... -------------- Закон - если код повторяется два раза и больше - в отдельную процедуру! Скажется на скорости - тадый ой. Будет исключение из Правил. Застрелишься только документировать... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2016, 17:42 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
Модератор: есть лестница для бесед не по теме топика. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2016, 18:53 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
Mina-капча, Ты, конечно, извини, но твой разбор меня повеселил. Ты говоришь об оптимизации кусков кода, которые дадут прирост скорости в единицы, если не доли процентов, т.к. все, что не касается собственно базы данных работает примерно одинаково на интерпретаторах псевдокода типа Акцеса (медленно, честно говоря, но приемлемо для наших задач). А вот уважаемый автор идеи взял и еще больше чем в 2 раза ускорил обновление, выяснив зависимость скорости от размера кусков деления, за что ему допонительное большое спасибо. Тест на 130К записей работает теперь 7 секунд при делении по на 100 вместо 20 секунд на 1000. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2016, 21:01 |
|
Update отфильтрованного рекордсета - оптимизация
|
|||
---|---|---|---|
#18+
Volunteer, * которые дадут прирост скорости в единицы, если не доли процентов дурак Вы, Ваше благородие.... Я хотел было сказать это значительно ранее, когда ты начал было сравнивать. Но поскромничал. Я тут пишу Оле трактат о том, как бабло давит идею :) Слово "оптимизация" произнес не я, а ты. Если б ты это озвучил, как "оптимизация на два сферических попугая в вакууме" я или бы послал тебя сразу, или бы просто промолчал. * работает примерно одинаково на интерпретаторах псевдокода - Ты только в других местах это вслух не произноси. От греха :) Сам то зацени - "примерно одинаково" Ни чо в душе программиста не восстает против? Примерно Одинаково Зацени, как программист, этот каламбур :) * в 2 раза ускорил обновление, выяснив зависимость скорости от размера кусков деления, за что ему допонительное большое спасибо - Двумя руками с тобой и искренне рад за тебя и в пах мне два раза если лукавлю.. Но... хоть в 22. Это ведь случай... пытаясь разобрать - читай ПОНЯТЬ-СПРОГНОЗИРОВАТЬ-СМАСШТАБИРОВАТЬ-РАЗМНОЖИТЬ который, мы упремся опять в непредсказуемые механизмы акса и его работы с дисковым кешем.... Даешь на пятаки, что в другом операционном окружении тот же косарь прокатит? А, может, наоборот - ЗАТОРМОЗИТ. Дашь ты мне общую рекомендацию на размер этого шага? К чему это я? А к тому, что ты лишь за частный случай гутаришь, за собственный. А я - за общий подход. Ты из своих радостей ничего другим не присоветуешь, в то время, как мои заметки имеют ценность абсолютную. Скажи - в каком из сових постулатов я неправ. Поправь. А то ты тут лишь попугаями козыряешь... Не, если ты мне приподнимешь веки - я буду весь твой и твоего консультанта. В своей задаче я организовал "свой" (мы ж не баре) кеш фифо в памяти акса. От балды назначил сто записей. Потом флэш на диск. Но вся жопа в том, что данные-то у меня летят в рилтайме. Что ты мне присоветуешь, исходя из полученного тобой от консультанта опыта? Ни. Че. Го. Тогда как мои рекомедации реально ОПТИМИЗИРУЮТ задачу в тактах процессора, а не в тових... сферических... блин, с кем я опять связался.... Забудь про попугаев и подчеркни - где в моей критике я был неправ. . . ... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2016, 22:37 |
|
|
start [/forum/topic.php?fid=45&fpage=104&tid=1613565]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
91ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 185ms |
0 / 0 |