Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.22;
Скачать: CL | DM;

Вниз

Как сделать мгновенно?   Найти похожие ветки 

 
FBuilder   (2008-01-16 13:11) [0]

Есть база данных удаленное на по локальной сетке.
Есть таблица (SQL запрос), которая отображает ее состояние.

табилца отображается пользователю - он ее видит, может по ней пробежаться.
записей порядка 100.

проблема: табилца обновляется по такймеру - ра зв 3 секунды.
сейчас получается что это все занмиает около 250 при апдейте :( У пользователя соответственно гладкого перемещения по таблице - нет - при обновлении все замирает и скрол - дергается.

Вопрос: как добиться более гладкого хождения пользователя по обновляемой таблице?

Mysql 4.0.x, DBExpress, dbx4mysql.dll

?


 
Kolan ©   (2008-01-16 13:25) [1]

> проблема: табилца обновляется по такймеру — ра зв 3 секунды.

Обновлять реже?


 
FBuilder   (2008-01-16 13:28) [2]

Не вариант - клиент просит еще чаще :(


 
Kolan ©   (2008-01-16 13:34) [3]

> Не вариант — клиент просит еще чаще :(

Чтоже это кто-то вводит данные раз в 3 секунды?
Мгновенно ессно не получится никогда.

Есть несколько предложений.
1.  «все занмиает около 250» секунд?

Тогда может при обновлении поступать так — сначала затягивать все данные а пользователь путь пока видит старые, как только все получено обновлять ?


 
Kolan ©   (2008-01-16 13:35) [4]

Потом хорошо бы не раз в три секунды, а тогда, когда данные действительно обновились&#133


 
FBuilder   (2008-01-16 13:37) [5]

250 мсек

>Тогда может при обновлении поступать так — сначала затягивать все данные а пользователь путь пока видит старые, как только все получено обновлять ?

можно так поступить:
Но ка кэто сделать на локальном DBGrid

Контрукция у меня такая:
DBGrid <- DataSource <- DataSet <- connection

вставить промежуточну таблицу?


 
FBuilder   (2008-01-16 13:38) [6]

> Потом хорошо бы не раз в три секунды, а тогда, когда данные действительно обновились…

Думал - варианто проверить когда они обновились практически нет (реальных)


 
Kolan ©   (2008-01-16 13:43) [7]

Контрукция у меня такая:
А как ты обновляешь?

Почему так часто меняются, что там?


 
FBuilder   (2008-01-16 13:46) [8]

.refresh
.execsql
по разному пробовал - результат почти одинаковый

Заказы в такси.


 
Kolan ©   (2008-01-16 13:49) [9]

> Заказы в такси.

А запрос у тя какой? может там какой нить бешеный запрос, а ты делаешь SELECT * FROM <table>.
Для оперативного мониторинга можно ограничить набор полей(2-3). На что пользователь смотрит листая грид?


 
FBuilder   (2008-01-16 13:53) [10]

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

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


 
Kolan ©   (2008-01-16 14:00) [11]

> там пару джоинов есть

Имхо тут основная проблемма. Может тебе завесли таблицу для мониторинга. В неё данные будут из осн. таблиц добавлять триггеры.
А запрос будет брать уже из этой таблицы. Будет быстрее.

> меня инетесует как теперь подменить так, чтобы я сначала
> эти данные получал в прогу, а потом мгновенно выводил в
> табилцу&#133

Можно пропробовать, в кач. эксперимента пока нет других идей/людей.

Подключать надор динамически.
То есть два дата сета с одним работает пользователь, второй по таймеру открываешь и меняешь DataSet у DataSource.
Надо будет еще и запомнить где курсор у пользователя был и назад выставить&#133

Тут скорее всего будет мигание неприятное&#133


 
FBuilder   (2008-01-16 14:04) [12]

Спасибо!

вот сейчас что-то подобное и пытаюсь сделать...
только что-то с этой сменй дата сета пока трабла небольшая...

ну а locate - да - немного протормаживает - но не так сильно как все остальное :)


 
Skyle ©   (2008-01-16 14:04) [13]

Использовать DisableControls/EnableControls и клиентский курсор.


 
Kolan ©   (2008-01-16 14:05) [14]

> только что-то с этой сменй дата сета пока трабла небольшая&#133

А как я трабла поменял и се&#133


 
FBuilder   (2008-01-16 14:41) [15]

>Использовать DisableControls/EnableControls и клиентский курсор.

Пробовал. Клиентский курсор - нет - это как на DBExpress рабоать точно будет?


 
Skyle ©   (2008-01-16 14:52) [16]


> FBuilder   (16.01.08 14:41) [15]
> >Использовать DisableControls/EnableControls и клиентский
> курсор.
>
> Пробовал. Клиентский курсор - нет - это как на DBExpress
> рабоать точно будет?

А я не пользовался ни разу этими компонентами, не знаю какая у них логика.

Смысл был таков
1. DisableControls/EnableControls отключают отрисовку при обновлении данных, что заведомо ускоряет процесс.
2. Использование клиентского курсора нужно понимать как "фетчить все записи на клиента и там уже показывать".

Если в этом случае всё тормозит, то проблема не в клиенте. Это либо запрос, либо подтормаживает сервер, либо сеть. Соответственно можно будет попробовать изменить подход к запросу.

Я например не смогу даже в течение минуты вникать в 100 записей, обновляющихся раз в 3 секунды, чесслово.


 
Kolan ©   (2008-01-16 14:55) [17]

> 1. DisableControls/EnableControls отключают отрисовку при
> обновлении данных, что заведомо ускоряет процесс.

Все равно будет затык у пользователя, имхо надо запрос оптимизоровать&#133 Или UI менять&#133


 
Kolan ©   (2008-01-16 14:56) [18]

Афтар объясни что должен видеть пользователь?


 
Sergey13 ©   (2008-01-16 15:09) [19]

> [0] FBuilder   (16.01.08 13:11)

Проверяй наличие обновлений в другом запросе. И только при их наличии обновляй показываемый.


 
FBuilder   (2008-01-16 15:30) [20]

> Sergey13 ©
Нереально - поиск обновлений будет грузить мускул на время гораздо большее чем нужно (даже с другого компа).

> Kolan ©  
Текущий список заявок в такси компании.


 
FBuilder   (2008-01-16 15:40) [21]

Как-то можно обновлять TSimpleDataSet в паралелльном потоке, а потом применять в табилце все в главном?


 
Правильный_Вася   (2008-01-16 15:41) [22]


> Текущий список заявок в такси компании.

не нуждается в обновлении каждые 3 сек

> Нереально - поиск обновлений будет грузить мускул на время
> гораздо большее чем нужно

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

> делал - там пару джоинов есть - но индексы по ним уже стоят

план запроса надо смотреть, а не индексы лепить


 
Kolan ©   (2008-01-16 15:46) [23]

> Текущий список заявок в такси компании.

да понял я, что конкретно, аддрес, дата, имя водителя, средняя температура двигателя , что именно?


 
Sergey13 ©   (2008-01-16 15:54) [24]

> [20] FBuilder   (16.01.08 15:30)
> Нереально - поиск обновлений будет грузить мускул на время
> гораздо большее чем нужно (даже с другого компа).

Почему это?
select * from ... where ...
и например
select sum(id) from ... where ...
будут по разному нагружать твой мускул? Второй может и пошустрее даже работать.


 
FBuilder   (2008-01-16 15:56) [25]

2Правильный_Вася

> Текущий список заявок в такси компании.
не нуждается в обновлении каждые 3 сек

Директору ты расскажешь?

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

> план запроса надо смотреть, а не индексы лепить
Еще раз проблема:
ЕСТЬ длительный запрос к таблице - нужно чтобы УИ не тормозило при обновлении информации, а не лечить как этот запрос исправить


 
FBuilder   (2008-01-16 15:58) [26]

2 Sergey13
В таблице около 40 полей (из которых читается часть) и несколько мемо, содержание которых внутри тоже может поменяться незначительно, но это есть изменение.
как мне такое контролировать и с чем сравнивать - держать табилцу паралелльную - тяжело :(


 
Sergey13 ©   (2008-01-16 16:02) [27]

> [26] FBuilder   (16.01.08 15:58)

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

ЗЫ: А тригеров в твоей мускулатуре нет еще?


 
Kolan ©   (2008-01-16 16:04) [28]

Мое имхо оперативной инфы должно быть не много. И загружать её будет быстро. А если юзер захочет детально просмотреь вызов какой нить, то тогда все и загружай&#133


 
FBuilder   (2008-01-16 16:05) [29]

2Sergey13
Пробелма - изменений туда может поступать из слишком разных и не только зависящих от меня источников - поэтому добавление подообной вещи - нет.

Тригеров нет, но в данном вопросе задача не уменьшить количество обновлений а сделать сам процесс обновления безобидней для польозвателя.
если это его будет выводить не каждую секунду, а каждые 10 секунд -разница небольшая :(


 
FBuilder   (2008-01-16 16:07) [30]

2Kolan

оперативно инфы обычно колонок 20, строчек 100. Просмотре дополнительно - оно понятно. Но вот эти стточки все равно на локалке при текущем железе дают 200 мс отклика у мускула.
хочется этот отклик спрятать от юзвера просто и он будет счастлив!


 
Sergey13 ©   (2008-01-16 16:14) [31]

> [29] FBuilder   (16.01.08 16:05)
> Пробелма - изменений туда может поступать из слишком разных
> и не только зависящих от меня источников

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

> задача не уменьшить количество обновлений а сделать сам
> процесс обновления безобидней для польозвателя.

Если свести задачу к только ОПРАДАННОМУ обновлению, то о безобидности может не надо будет беспокоиться?


 
FBuilder   (2008-01-16 16:21) [32]

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

> Если свести задачу к только ОПРАДАННОМУ обновлению, то о безобидности может не надо будет беспокоиться?

Думал, прикидывал
Вкратце, если посчитать, то там выходит и так обновление раз в 3 секунды 50% вероятность что принесет новые данные при этом потоке заказов.

Поясни мне простую весчь: делаю отдельный TSimpleDataSet
в него в паралелльном потоке отдельным коннекшеном никого не трогая гружу данные - все ок.

Как мне эти данные потом быстренько отобразить или перекинуть их в ото SimpleDataSet из которого Grid смотрит (уже день за этим - немного туплю...)


 
Правильный_Вася   (2008-01-16 16:22) [33]


> Директору ты расскажешь?

директору эти записи как на заборе - сто лет снились

> перелопатить всю прогу так как изменений в эту таблицу может
> вноситься в более чем 20 мест

чтобы рыбку съесть, надо в воду лезть
зачем ты однои тоже делаешь в разных местах разными способами?

>  контролировать синхронизацию времени на клиентах.

причем тут клиенты - время на сервере БД одно на всех


 
Kolan ©   (2008-01-16 16:23) [34]

> оперативно инфы обычно колонок 20

Ого, не верю. имхо 2-3 достаточно, ну 5 &#133 но не 20. Отсюда ноги растут&#133 Выкладывай что за поля&#133


 
Kolan ©   (2008-01-16 16:31) [35]

Человек в принципе не может следить за 20 парам параметрами в 100 строках, которые обновляются каждые 3 сек или чаще&#133


 
FBuilder   (2008-01-16 16:34) [36]

2Kolan

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

это основные + есть дополнительные ка километражы, простои и т.д.

запрос я оптимзировал - вопросов нет.
как мне оператично ланные в DBGrid из паралелльного потока забрасывать?


 
Kolan ©   (2008-01-16 16:45) [37]

> номер каротчки или скидки, нал безнал

Очень нужная оперативная инфа. Без номера карточки никак :)

Проанализируй как они используют инфу. Но на вскидку:

Адрес, Имя клиента, Телефон, Статус(я так понял это типа не приехал еще/отвозит&#133), время подезда водителя

Все, остальное в открывать в отдельном окне, по желанию пользователя.
Кроме того твои 20 полей на монитор как помещаются? Неужели бедняги скролят еще и в бок 0_o?


 
FBuilder   (2008-01-16 16:48) [38]

Помещаються впритык :(

Вопросы ка кперебрасывать данные полученные уже внтури приложения но из другого потока?


 
Kolan ©   (2008-01-16 16:52) [39]

> Помещаються впритык :(

Шо и адрес с именем полностью видны? Или у них Apple cinema 30" моники?


> Вопросы ка кперебрасывать данные полученные уже внтури приложения
> но из другого потока?

Как этот вопрос связан с сабжем?


 
FBuilder   (2008-01-16 17:02) [40]

>Шо и адрес с именем полностью видны? Или у них Apple cinema 30" моники?
Нет, но широкоформатные.

>Как этот вопрос связан с сабжем?
Так, что удинственный путь, который я вижу - это параделльный поток, который получает всю табилцу, теряет невидимо для пользователя эти 250 мсек, но зато он их потерял - все - их нужно забросить в табилцу только - отобразить уже в основном потоке.
Основной поток должен не к базе стучаться - а к внутреннему dataset в котором эти данные уже есть. Но я что-то уже запутался как мне их из одного дата сета получит ьв другой :(



Страницы: 1 2 вся ветка

Текущий архив: 2008.06.22;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.018 c
15-1210302230
31512
2008-05-09 07:03
2008.06.22
Поздравляю всех с Днём Победы!


2-1211990948
StiTch
2008-05-28 20:09
2008.06.22
Блок Схема


2-1211792539
Leo
2008-05-26 13:02
2008.06.22
Зеленый вопрос IF ... THEN


3-1200384713
developer
2008-01-15 11:11
2008.06.22
collations в MS SQL 2005


2-1211870709
Radgar
2008-05-27 10:45
2008.06.22
Мерцание при перемещении