powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / БД, она тормозит с обновлением что ли...
25 сообщений из 52, страница 1 из 3
БД, она тормозит с обновлением что ли...
    #37077814
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, заменил вроде кусок проги, что могу тестировать хоть что-то...

Действие:

модуль следящий за процессами

1А) Меняет строку в таблице БД
Код: plaintext
1.
           'редактирование записи
            adoConn.Execute ("UPDATE table SET " & SQLString & " WHERE field LIKE '%" & somevalue & "%'")
2А) Генерирует текстовой файл (содержание-та же строчка) для быстрого обновления информации в ListView (в модуле UserInterface) -пока кидаюсь файлом(как у меня и было, но планирую таже через БД)

============================
модуль UserInterface с Listview
1Б) по таймеру(Interval=1000) ловит файл, сгенерированный в п.2А (выше) и обновляет строчку в ListView
Все корректно...

Но дальше: в UserInterface есть кнопка "Обновить".
Смысл: вся информация в ListView (700 строк в моем тесте) считывается из вышеупомянутой таблицы Table
Сразу после обновления одной строчки(1Б) жмем этот обновить и видим что

Строка заменилась СТАРЫМИ данными. Нет, с какого-то раза НОВЫЕ данные появляются, но это может быть через несколько секунд.

Т.е. вывод какой: команда 1А выполняется СЛИШКОМ ДОЛГО. Когда вместо Table была текстовуха, ничего подобного не было.
А я еще планирую пункты 2А и1Б заменить на
2АА) генерирует строчку в БД с указателем на строку обновленную в п.1А
==============
1ББ) по таймеру читает 2АА) из БД и заполняет одну(или несколько) строчку ListView из основной таблицы Table.
А если там еще будет старое значение.
И вообще, эти тормоза это не дело.

М.б. подход неправильный? А какой правильный? Текстовухи оставить и не лезть в эти БД?
Процессы кот. отслеживаются достаточно динамичные и задержки с отображением в несколько секунд мне не нужны...
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078123
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ээээ...все гораздо хуже.
Это не СЛИШКОМ ДОЛГО, это ж, это потеря данных, это НЕНАДЕЖНО.

Действие:
модуль следящий за процессами

1) Добавляет строку в Table через INSERT INTO

на следующем шаге через короткое время (информация по данному процессу изменилась):

2) Запрашивает по какому-то критерию эту же строку через SELECT ...WHERE
и если она есть (RS.EOF=false)
то

3) Делает ей обновление через UPDATE.

Так вот засада в том, что на запрос в п.2 БД отвечает ("дарагой, да нет такой строки" RS.EOF=true), очевидно не успев обновиться согласно п.(1)

Это не тормоза, это Ж, это гнилая технология. Это даже уже не знаю что делать...
Это не на 700 строчках, это на одной строчке глючит.
Идеи есть, кроме как послать все эти ADODB и БД в еБД?
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078255
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тэкс. Что-то ты не то наворотил, все должно работать нормально, без задержек.

Вопрос для начала такой, а ты часом не используешь ДВА РАЗНЫХ коннекшна к одной базе?
Если так - переделай на один.

Если один - показывай фрагменты кода.

ЗЫ: Или это вообще две разных программы?
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078285
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий771) Добавляет строку в Table через INSERT INTO
на следующем шаге через короткое время (информация по данному процессу изменилась):
2) Запрашивает по какому-то критерию эту же строку через SELECT ...WHERE
...
Так вот засада в том, что на запрос в п.2 БД отвечает ("дарагой, да нет такой строки" RS.EOF=true)

В одном коннекшне запросы стопудово работают синхронно (если только ты не запускаешь асинхронно умышленно), поэтому такой ситуации просто не может быть
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078301
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЗЫ: Или это вообще две разных программы?
Естественно.
1) модуль следящий за процессами
2) модуль UserInterface с Listview

Это как минимум. Могут быть еще другие "клиенты", но эти 2 основные.

Поэтому естественно
Shocker.Proиспользуешь ДВА РАЗНЫХ коннекшна к одной базе

Причем указанные 2 модуля должны держать коннекты непрерывно.
Переделать в один не могу, нарочно разделял.
Тот который "следящий за процессами" может быть "сервисом NT under local system account".
Тот который "UserInterface с Listview", может быть вообще не запущен, прога все равно будет делать "дела".

Можно конечно "отключаться/подключаться", но сам понимаешь...
И потом это будет очень хаотический коннект/дисконнект.

Приложение достаточно динамическое.
Глобальные цели:
1) Улучшение "динамики", особенно при большом количестве строк и (или) одновременных процессов.
2) Легкость в добавлении новых ф-ций: поле напр. в БД проще добавить, чем переписать обработку текстовух.
3) Одновременный безпроблемный доступ к одной и той же "таблице". ("следящий за процессами" может добавить/редактировать строчку, User может строчку "редактировать"/удалить).

Если я сейчас добавлю "обновление ListView через БД" с долблением БД по таймеру то при таком раскладе вообще все встанет.
Т.е. операция Execute выполняется "несколько секунд", что неприемлимо.
С таблицей-текстовухой: прочитал, нашел, поменял, сохранил- таких проблем не было. И переклиниваний из-за одновременного доступа к одной и той же текстовухе тоже не заметил, хотя логично предположить что это потенциальная проблема "текстовой" версии.
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078318
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я конечно понимаю что
WHERE field LIKE '%" & somevalue & "%'"
м.б. не лучший вариант (извесно кстати что строчка только одна, ее и надо получить)

лучше наверно (по возможности! не всегда возможно!)
WHERE field='value'

но не похоже что глобальная проблема в этом.
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078327
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Т.е. операция Execute выполняется "несколько секунд", что неприемлимо.
Так сколько выполняется Execute - имеется ввиду, что синхронная операция выполняется несколько секунд? (то есть в пределах одного приложения, другого пока не рассматриваем)

Дмитрий77Ну я конечно понимаю что
WHERE field LIKE '%" & somevalue & "%'"
м.б. не лучший вариант (извесно кстати что строчка только одна, ее и надо получить)
Отвратительный вариант. Если знаешь ключ строки - работать надо с ним. Засунь его в тэг листвью.
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078377
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProДмитрий77Т.е. операция Execute выполняется "несколько секунд", что неприемлимо.
Так сколько выполняется Execute - имеется ввиду, что синхронная операция выполняется несколько секунд? (то есть в пределах одного приложения, другого пока не рассматриваем).
И как я это посчитаю? И зачем? Я и так вижу что несколько секунд.
Посмотри в начало топика.
1A дает команду базе
потом 1Б дает команду Listview "небазовым методом" (т.е. с т.зр. приложения команда 1A прошла)
никаких доп.ключей в Execute я не использую.
в ListView строчка обновилась
потом я через Refresh читаю базу (таблицу) целиком
и по виду той самой строчки понимаю что база команду 1A ни фига не выполнила
и только после раза 5-го из базы скачивается "обновленная" информация


Shocker.ProДмитрий77Ну я конечно понимаю что
WHERE field LIKE '%" & somevalue & "%'"
м.б. не лучший вариант (извесно кстати что строчка только одна, ее и надо получить)
Отвратительный вариант. Если знаешь ключ строки - работать надо с ним. Засунь его в тэг листвью.
Тэг я кажется для сортировки дат использую.
Ну а при чем тут ListView. Такие "умные запросы" не UserInterface, а "модуль следящий за процессами" посылает, ему про ListView вообще ничего не известно. Критерием для поиска строчки является значение одного из полей (в нек. случаях часть поля), кот. не повторяется по логике программы.

Не кажется ли Вам, что вся эта кухня тухлятинкой попахивает?
Ну, потерял несколько дней, бывает.
А то ведь и вправду через год волосы на себе рвать буду...
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078380
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

зачем в тег, у листвью есть свой кей.

ТС , что за СУБД ?
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078431
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-duke,

База mdb. Тестовый экземпляр создан в Access-2000.
Предполагается создавать программно. Но если так дальше пойдет, то до этого боюсь не дойдет.
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078520
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И как я это посчитаю?
Код: plaintext
1.
2.
t = Now
Execute
debug.print DateDiff("s",Now,t)
Еще было бы интересно узнать, сколько записей в таблице, что так нещадно апдейтится.

Поэтому естественноНеестественно. Модуль, следящий за процессами, можно сделать в виде ActiveX exe, подключаться к нему через GetObject, просить соединение. А лучше не просить и вообще избавиться от таймера и дурацкого файла - надзиратель должен генерировать события с данными для интерфейса.
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078554
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77И как я это посчитаю? И зачем? Я и так вижу что несколько секунд.
Посмотри в начало топика.
1A дает команду базе
потом 1Б дает команду Listview "небазовым методом" (т.е. с т.зр. приложения команда 1A прошла)
Так еще, раз, ты меня не понял.
Сколько времени выполняется конкретно команда Execute? (видимость обновленных данных в другом приложении пока не рассматриваем). Если несколько секунд - факт, что ты делаешь что-то неправильно.


Дмитрий77Ну а при чем тут ListView. Такие "умные запросы" не UserInterface, а "модуль следящий за процессами" посылает, ему про ListView вообще ничего не известно.
Данные надо обновлять по ключу, а не по Like. Тот, кто посылает команду Update, должен знать ключ строки, для того он и предназначен. Иначе ты навешиваешь блокировку по транзакции на всю, блин, таблицу, пока идет сканирование по Like, естественно, другие процессы начинают тормозить.

Дмитрий77Не кажется ли Вам, что вся эта кухня тухлятинкой попахивает?
Ну, потерял несколько дней, бывает.
А то ведь и вправду через год волосы на себе рвать буду...
Если считаешь, что проще и быстрее ездить на велосипеде, потому что не смог разобраться с педалью сцепления в автомобиле - твое право. И даже достоинства у велосипеда есть неоспоримые. Но, скажем, смотраться на выходные на дачу проще все же на авто.
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078579
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyИ как я это посчитаю?
Код: plaintext
1.
2.
t = Now
Execute
debug.print DateDiff("s",Now,t)
.
Ты не понял суть "задницы".
Вот типичный кусок кода надсмотрщика:
Код: plaintext
1.
2.
3.
            adoConn.Execute ("UPDATE table SET " & SQLString & " WHERE ...
            'создание файла обмена данными (пока файл)
            Text.Add "string_to_change;" & str
            Text.SaveText AppDirectory & "log\name.ext"

Файл name.ext (в нем находится одна строчка str, которая дублирует ту строчку в Table, что я посылаю в БД командой Update)
Этот файл считывается таймером приложения, где ListView и обновляется одна строчка в ListView.
И обновление этой строчки в ListView происходит быстро (из текстовухи, которая генерируется уже после Update)
Посему понятно что debug.print DateDiff ничего плохого не покажет.

А вот после того как строчка ListView обновилась (из текстовухи,которая генерируется уже после Update)
Я в приложении где ListView жму кнопку "перегрузи весь ListView из базы", и весь ListView запрашивается из базы.
И в том числе та строчка. И с ней все остальные
И эта строчка оказывается со старыми данными (тем которое были до Update).
Теперь понятно объянил?

AntonariyЕще было бы интересно узнать, сколько записей в таблице, что так нещадно апдейтится.]
Пробовал 700 строчек, пробовал 1 строчку. Результат примерно одинаков.
Update давно отработал, а информация в базе не обновилась.

А маразм доходит до того, что если из надсмотрщика делать код:
Код: plaintext
1.
2.
3.
4.
( 1 ) adoConn.Execute ("INSERT INTO table...
bla-bla-bla
( 2 ) RS=adoConn.Execute (SELECT * FROM table WHERE та строчка что добавлена в ( 1 )
IF RS.EOF=false
   adoConn.Execute (UPDATE table SET... WHERE та строчка что добавлена в ( 1 )

то этот update не срабатывает, т.к.
"та строчка что добавлена в (1)"
еще не оприходовалась базой на момент когда ее надо уже править.


т.е. я понимаю что 2-3сек не критично для секретарши которая ковыряет в носу, забивая при этом
И-МЯ....ФА-МИ-ли---ЯЯЯЯЯ воз-расст <АББ-НАВИТЬ>

но м.б. просто данная технология не для данной задачи?
Честно, слышал что люди имеют проблемы при работе с БД, но не ожидал что это такое Г.

Мою реализацию конечно можешь обсмеять, сказать много умного про ActiveX, SQL-сервер и т.п.
Но проблема то не в этом. А проблема в том, что время "реальности/доступности" обновленных данных измеряется се-кун-дами, а это неприемлимо.

Вот я счас потратил несколько дней чтобы имплементировать БД-access (частично, но можно тестировать). Это при том что я это хоть немного знаю.
А прикинь я счас месяц потрачу на изучение каких-то новых "технологий" и будет такая же Ж.

М.б. лучше направить усилия на оптимизацию моих "текстовых БД"?

Shocker.ProТак еще, раз, ты меня не понял.
Сколько времени выполняется конкретно команда Execute? (видимость обновленных данных в другом приложении пока не рассматриваем).
Очень недолго выполняется, см.выше., или это непонятно из приведенного кода.
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078584
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77А маразм доходит до того, что если из надсмотрщика делать код:
Код: plaintext
1.
2.
3.
4.
( 1 ) adoConn.Execute ("INSERT INTO table...
bla-bla-bla
( 2 ) RS=adoConn.Execute (SELECT * FROM table WHERE та строчка что добавлена в ( 1 )
IF RS.EOF=false
   adoConn.Execute (UPDATE table SET... WHERE та строчка что добавлена в ( 1 )

то этот update не срабатывает, т.к.
"та строчка что добавлена в (1)"
еще не оприходовалась базой на момент когда ее надо уже править.

Нет, при едином коннекте такого гарантированно вообще не может быть. Обновив данные ты тут же получишь обновленные, а не старые.
Так что просто ты что-то не так делаешь, но я никак не могу понять из приведенных фрагментов - что именно.

Можешь вычленить в чистый проект только этот код и выложить его вместе с тестовой таблицей БД?
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078603
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

легко сказать "вычлени в чистый проект".
В надсмотрщике я даже Debug.Print и /verbose применить легко не могу ибо он запускается из-под другого приложения и читает данные других модулей.
Я добавил этот "дебаг" в лоб, раз уж просили посчитать (придется удалять потом) -сарказмов и лекций просьба не надо.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 26 . 01 . 2011   0 : 56 : 13 	 0 	(Execute1)
 26 . 01 . 2011   0 : 56 : 13 	 0 	(Execute1)
 26 . 01 . 2011   0 : 56 : 13 	 0 	(Execute2)
 26 . 01 . 2011   0 : 56 : 13 	 0 	(Execute2)
 26 . 01 . 2011   0 : 56 : 14 	 0 	(Execute3- 1 )
 26 . 01 . 2011   0 : 56 : 14 	 0 	(Execute3- 1 )
 26 . 01 . 2011   0 : 56 : 14 	 0 	(Execute3- 2 )
 26 . 01 . 2011   0 : 56 : 14 	 0 	(Execute3- 2 )
 26 . 01 . 2011   0 : 56 : 34 	 0 	(Execute4- 1 )
 26 . 01 . 2011   0 : 56 : 34 	 2 	(Execute4- 1 )
 26 . 01 . 2011   0 : 56 : 34 	 0 	(Execute4- 2 )
 26 . 01 . 2011   0 : 56 : 34 	 1 	(Execute4- 2 )
 26 . 01 . 2011   0 : 57 : 07 	 0 	(Execute4- 1 )
 26 . 01 . 2011   0 : 57 : 07 	 3 	(Execute4- 1 )
 26 . 01 . 2011   0 : 57 : 07 	 0 	(Execute4- 2 )
 26 . 01 . 2011   0 : 57 : 07 	 2 	(Execute4- 2 )
 26 . 01 . 2011   0 : 57 : 12 	 0 	(Execute5- 1 )
 26 . 01 . 2011   0 : 57 : 12 	 0 	(Execute5- 1 )
 26 . 01 . 2011   0 : 57 : 12 	 0 	(Execute5- 2 )
 26 . 01 . 2011   0 : 57 : 12 	 0 	(Execute5- 2 )
 26 . 01 . 2011   0 : 57 : 12 	 0 	(Execute6- 1 )
 26 . 01 . 2011   0 : 57 : 12 	 0 	(Execute6- 1 )
/Это один "процесс", из может быть несколько (или много) параллельных./
Время самого паршивого execute составило 3 милли секунды, что приемлимо; до/после идут парами.
Но при этом из БД считываются старые данные еще несколько секунд после...


>Нет, при едином коннекте такого гарантированно вообще не может быть.
Возможно, что-то напутал и вы правы. С этим думаю смогу разобраться.
Но вот с задержкой обновления, когда считываешь эту таблицу факт есть факт.
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078612
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77>Нет, при едином коннекте такого гарантированно вообще не может быть.
Возможно, что-то напутал и вы правы. С этим думаю смогу разобраться.
Но вот с задержкой обновления, когда считываешь эту таблицу факт есть факт.
Честно говоря, и это несколько странно.
Тогда тем более хотелось бы оба проекта в "очищенном" виде "для опытов" (с)
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078624
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Код: plaintext
1.
2.
3.
4.
( 1 ) adoConn.Execute ("INSERT INTO table...
bla-bla-bla
( 2 ) RS=adoConn.Execute (SELECT * FROM table WHERE та строчка что добавлена в ( 1 )
IF RS.EOF=false
   adoConn.Execute (UPDATE table SET... WHERE та строчка что добавлена в ( 1 )
Не совсем так.
Сейчас чуть добавил дебага.
IF RS.EOF=false срабатывает корректно, но почему-то иногда может
не сработать
adoConn.Execute (UPDATE table SET... WHERE та строчка что добавлена в (1)
т.е. может сработать, а может не сработать.
При этом к строке апдейта я придраться не сумел.


>Тогда тем более хотелось бы оба проекта в "очищенном" виде "для опытов" (с)
Не смешите меня, я этими опытами уже 2 года занимаюсь.
Это не будет работать в отрыве от всего приложения.
Данные на вход "надсмотрщика" поступают из C++ плагина, кот. работает из под C++ приложения, кот. держится на нескольких dll и т.п.

>Честно говоря, и это несколько странно.
а что странного?
Скорее всего глобальная проблема в следующем. Каждое Connection работает со своей "локальной копией" таблицы, базы и всей дребедени что с этим связано. Естественно по каким-то (медленным) законам идет обмен с "базой", но это действительно секунды, а не миллисекунды.
Другой Connection работает со своей "локальной копией", которой про первую "копию" ничего не известно.
Для обычной офисной базы этого более чем достаточно.

Для динамической задачи этого не достаточно.
Как вариант можно попробовать закрывать Connection (а не только рекордсет) после каждой операции, а потом открывать по новой.
Можно попробовать отказаться от Execute и открывать рекордсеты "по-полной"
Попробую завтра поиграться (применительно к тому "участку" проги что сделал). Но непонятно выдержит ли сама база и ADODB такой долбеж, а он и так не хилый.
и главное будет ли это НАДЕЖНЫМ решением. Во времени я скорее всего сильно не проиграю.

Т.е. на данном этапе надо довыяснить приемлимость модели, пока ответ "НЕТ".
Текстовые файлы выдерживают.

Что касается конструкций like %%, ну лучше конечно=, но это думаю "в рамках". По "ключу" вряд ли удастся.
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078647
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Как вариант можно попробовать закрывать Connection (а не только рекордсет) после каждой операции, а потом открывать по новой.
Ага, так и есть. Если так делать, то все синхронно.
Но при этом время на считывание 700 строк возрастает на 50% (+70мс на мощном компьютере), это дольше чем прочитать текстовуху.
И еще непонятно, сколько мы теряем на "обработку одной записи", и не возникнет ли ситуации, что поток входящих данных за единицу времени превысит "максимальную пропускную способность" для обработчика. Т.е. если есть 50 процессов, и за секунду поступило 50 файлов, надо за эту секунду переконнектиться с базой 50 раз. Если на один реконнект тратится пусть 50мс, то 50Х50=2500мс=2,5сек. Как-то неправильно. Можно конечно делать реконнект по таймеру раз в сек (как я и делаю с данными). Connect>переработка данных> дисконнект. Остается еще понять, при дисконнекте база сразу ли проапгрейдится...
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078654
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078977
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77а что странного?
Скорее всего глобальная проблема в следующем. Каждое Connection работает со своей "локальной копией" таблицы, базы и всей дребедени что с этим связано.
Коннекшн не работает с таблицей вообще - это прерогатива рекордсета, а его-то как раз ты открываешь заново, поэтому он не может его кешировать.

Несколько секунд - на мой взгляд очень много, не должно быть такого.
Поэтому я просил очищенный тестовый вариант - чтобы можно было бы поиграть с параметрами соединения и самими запросами.
Пока основное подозрение на like - из-за того, что он каждый раз при обновлении он сканирует (а может и блокирует) всю таблицу, возможно долго идет фиксация транзакции. Но это все надо пробовать руками на живом примере - теоретизирование результатов не даст.
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37078984
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пробуй камнемДмитрий77,
поддержка Майкрософт о Вашей проблеме
The writer must start a transaction, using ADO's Connection.BeginTrans, prior to writing the data.
The writer must make the database updates and then commit the transaction (using ADO's Connection.CommitTrans).
The reader must call JRO.JetEngine.RefreshCache passing in it's connection prior to attempting to read the data.
ну на первый взгляд - по делу
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37079137
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProДмитрий77а что странного?
Скорее всего глобальная проблема в следующем. Каждое Connection работает со своей "локальной копией" таблицы, базы и всей дребедени что с этим связано.
Коннекшн не работает с таблицей вообще - это прерогатива рекордсета, а его-то как раз ты открываешь заново, поэтому он не может его кешировать..
Это все игра слов, анатомия и т.п. (вскрытие трупов и изучение "всей дребедени" не является целью) а суть я похоже угадал, и слава богу что хоть так.
А пробуй камнем подсказал как правильно, за что ему наверно заранее спасибо, и думаю так и надо.
Сейчас времени нет, а вечером обязательно попробую и отчитаюсь.
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37079361
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПока основное подозрение на like - из-за того, что он каждый раз при обновлении он сканирует (а может и блокирует) всю таблицу, возможно долго идет фиксация транзакции. Но это все надо пробовать руками на живом примере - теоретизирование результатов не даст.
C Like я согласен что лучше по возможности надо менять на ='value'(не всегда возможно, но в большинстве случаев у меня возможно, это из-за лени вычислить точное значение их налепил), я уже убрал вчера кроме одного-двух мест, но "живой пример" показывает что это особых выигрышей на таблице в 1000 строк не дает и несоизмеримо с описанной выше проблемой, по сути которой пока все сказано выше.

По хорошему еще надо добавить в запрос:
1) ищи только первое значение (наф. перелопачивать все, если уже нашли чего искали)
2) ищи его начиная с последних записей (sorted by key который incremented по убыванию, но не уверен что это sorted само по себе не добавит тормозов, одно дело всю таблицу в listview выводить, а другое дело просто короткий запрос)

Если здесь подскажете, воспользуюсь.

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

Shocker.ProПоэтому я просил очищенный тестовый вариант - чтобы можно было бы поиграть с параметрами соединения и самими запросами.
Это примерно эквивалентно тому, что заново все написать. Я уже написал что это нереально при всем уважении к Вам и вашему желанию помочь.
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37079497
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77По хорошему еще надо добавить в запрос:
1) ищи только первое значение (наф. перелопачивать все, если уже нашли чего искали)
2) ищи его начиная с последних записей (sorted by key который incremented по убыванию, но не уверен что это sorted само по себе не добавит тормозов, одно дело всю таблицу в listview выводить, а другое дело просто короткий запрос)

Код: plaintext
SELECT TOP  1  Field1 FROM .... WHERE.... ORDER BY Field1 DESC
Для Update такое не пройдет, естественно. Однако в SELECTe можно получить ключевое поле и использовать его в UPDATE. Это лучше, чем Like в Update, а SELECT все равно есть.

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

Дмитрий77Поясню: например в почтовой программе есть письма "готовые к отправке", "отправля емые " (в тек. момент) и "отправ ленные " (архив).
Надо просто ввести соответствующее поле с признаком и в WHERE дополнительно отбирать по этому признаку.

Дмитрий77Shocker.ProПоэтому я просил очищенный тестовый вариант - чтобы можно было бы поиграть с параметрами соединения и самими запросами.
Это примерно эквивалентно тому, что заново все написать. Я уже написал что это нереально при всем уважении к Вам и вашему желанию помочь.
Ну это отладка методом последовательного приближения. Вот тут 7886988 подобную работу пришлось проделать, но она того стоила, ибо баг был побежден. Получается либо уполовинивать свой проект, проверять баг, если есть уполовинивать дальше и т.п. Либо наоборот создать чистый проект только с существенными функциями (в нашем случае это два проекта, один с инсертом, другой с селектом по таймеру) и смотреть, есть ли баг. Тут тебе виднее.
Впрочем, надо сначала попробовать совет от микрософта.
Однако, если даже если он поможет, это не отменяет оптимизации работы с БД.
...
Рейтинг: 0 / 0
БД, она тормозит с обновлением что ли...
    #37080764
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProВпрочем, надо сначала попробовать совет от микрософта.
Да, проверил. Все путем. Основная проблема с задержкой обмена в несколько секунд решается.
Но это было ясно без кодов и без проверки после того как.
1. Я предположил что re-connect спасет, и это подтвердилось проверкой. Хотя понятно что долбеж connect-disconnect не есть гуд.
2. Пробуй камнем ткнул в правильное решение проблемы. Спасибо ему еще раз.

Единственное. Конструкция (обновиться перед чтением):
Код: plaintext
1.
2.
Public my_JRO As New JRO.JetEngine
...
        my_JRO.RefreshCache adoConn
требует дополнительно ссылаться на
Microsoft Jet and Replication Objects 2.6 Library (msjro.dll)

Ответа по поводу какую версию ADO подключать я так и не получил (вы упомянули про 2.8 и типа усе есть, но я бы не форсировал...из осторожности),
поэтому считаю логичным, если уж добавлять refrerencы то вот эту пару
Код: plaintext
1.
Microsoft ActiveX Data Objects  2 . 6  Library (msado26.dll)
Microsoft Jet and Replication Objects  2 . 6  Library (msjro.dll)
По крайней мере этот вариант прокатил на чистой Win7 x64 (компилирую на XP 32 bit ясно дело).

Или все-таки CreateObject? Вот все беспокоюся...Меня честно это сторона вопроса беспокоит гораздо больше чем Like %%. Т.е. предпочту ездить на велосипеде чем разбиться на недоделанном ЛА.
P.S. При наличии парашюта и навыков по применению оного можно и по крайнему варианту. Но есть проблема: не все пользователи - парашютисты.

По поводу лайков и прочего. Ну это на самом деле рихтовка по сравнению с задержками на секунды.
Тем не менее не буду злоупотреблять советами.
Shocker.ProПоле, по которому идет сортировка, надо индексировать .
бог с ним, сделал:
Код: plaintext
1.
2.
3.
4.
Имя поля = ID
Тип данных = счетчик
Размер поля = длинное целое
Новые значения = последовательные
Индексированное поле = да (совпадения не допускаются)

Shocker.ProОднако в SELECTe можно получить ключевое поле и использовать его в UPDATE. Это лучше, чем Like в Update... в сочетании с TOP 1....
В большинстве ф-ций применил конструкцию:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
     Dim lng_ID As Long
...
       my_JRO.RefreshCache adoConn
       Set RS = adoConn.Execute _
          ("SELECT TOP 1 * FROM Table WHERE field='value' ORDER BY ID DESC")
...
        If RS.EOF = False Then 'только если запись существует (по структуре базы она единственная)
...
            lng_ID = RS!ID
...
            adoConn.BeginTrans
            adoConn.Execute ("UPDATE table SET " & SQLString & " WHERE ID=" & CStr(lng_ID))
            adoConn.CommitTrans

Однако идеализировать не надо, есть исключения:

1. В одном месте я все таки применяю LIKE (констукция field имеет вид "СЛОВО(StrValue)", где СЛОВО - могут быть разные):
Код: plaintext
1.
2.
        my_JRO.RefreshCache adoConn
        Set RS = adoConn.Execute _
          ("SELECT TOP 1 * FROM table WHERE field LIKE '%" & StrValue & "%' ORDER BY ID DESC")
2.Shocker.Proа SELECT все равно есть.
не всегда оно есть. Строчка может обновляться целиком (т.е. все новые значения полей содержатся в свежепоступивших данных). Тогда первый запрос с SELECT отсутствует, т.е. тогда
Код: plaintext
1.
2.
            adoConn.BeginTrans
            adoConn.Execute ("UPDATE table SET " & SQLString & " WHERE field='value'")
            adoConn.CommitTrans

Но это повторюсь рихтовка. Чтобы оценить динамику, надо все доделать, тогда смогу запустить краш-тесты (скажем по 50 одновременных процессов с разрастанием таблицы до нескольких тысяч записей). Вот тогда и посмотрим, как эти 50 строк будут "одновременно" обновляться при скажем 10000 записей в таблице (реально обычно 1-3 процесса и 10-100 записей, но динамично-массовые исключения должны быть предусмотрены и также реально могут иметь место быть на отдельных пусть редких user-системах). Понятно что без решения первой проблемы ни о какой динамике говорить вообще нельзя, но она тьфу-тьфу решилась.

Shocker.ProНу это отладка методом последовательного приближения..
Ну а как ты хотел. Запускается через Shell из под другой проги, в Debuggeре не посмотришь, в отрыве от контекста не проверишь, /verbose особо не вставишь, надо дописывать строки, потом удалять или комментировать, но такие комментарии в большом кол-ве это "мусор" в коде. Добавь сюда до кучи еще протектор, без обработки которым некот. модули вообще работать не будут.
Shocker.Proв нашем случае это два проекта, один с инсертом, другой с селектом по таймеру..
Не упрощайте, и того и другого и третьего в обоих хватает....
У меня там не 2 проекта а два десятка модулей, если не больше. Хотя согласен, не все лезут в БД с целью ее изрикошетить, таких не много. Эти 2 -основные.

Shocker.ProТут тебе виднее...

Ясно дело...Но какую-то часть осилил. Можно двигаться дальше.
...
Рейтинг: 0 / 0
25 сообщений из 52, страница 1 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / БД, она тормозит с обновлением что ли...
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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