Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 в котором эти данные уже есть. Но я что-то уже запутался как мне их из одного дата сета получит ьв другой :(


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

> Основной поток должен не к базе стучаться &#151; а к внутреннему
> dataset в котором эти данные уже есть. Но я что-то уже запутался
> как мне их из одного дата сета получит ьв другой :(

Передать в событии например, получил дата сет &#151; вызывается событие в котором и передается нужный дата сет.

Я бы его(сам объект) каждый раз создавал, чтобы с синхронизацией не парится&#133

Ты правильно мыслишь, но как подмену дата сета незаметно сделать &#151; вот что я не представляю&#133


 
Kolan ©   (2008-01-16 17:06) [42]

Я те точно говорю твои 20 полей и не нужны всегда, начал бы ты с этого&#133


 
FBuilder   (2008-01-16 17:08) [43]

> Я те точно говорю твои 20 полей и не нужны всегда, начал бы ты с этого…
У тебя на клавиатуре все клавиши всегда нужны? :)

Для меня такой разговор будет равносилен этому вопросу :(


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

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


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

> У тебя на клавиатуре все клавиши всегда нужны? :)

Нет, если бы клава была не из пластика, то некоторые спрятвть было бы неплохо.
Что собссно некоторые и пытаются сделать:
http://www.artlebedev.ru/everything/optimus/
http://www.artlebedev.ru/everything/optimus-tactus/


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

Ты ошибся при проектировании UI так как не понял, что будет делать пользователь интерфейса. А теперь борешься с последствиями.

Раз у них моники широкие чтобы все влезо, то можно пойти дальше &#151; приколи купить сервер помощнее &#133


 
clickmaker ©   (2008-01-16 18:21) [47]


> [43] FBuilder   (16.01.08 17:08)

а как умудряются так часто вводить новые данные? прямая связь с мозгом таксиста?


 
Kolan ©   (2008-01-16 18:30) [48]

> а как умудряются так часто вводить новые данные? прямая
> связь с мозгом таксиста?

Да имхо там только новый добавляются. Видимо диспетчеру звонят, делают заказ &#151; он вбивает. А таксистам звонит другая тетка. Вот для неё и прога, она видит вбитую запись и связывается с таксистом&#133 Нафих ей при этом видет &laquo;номер каротчки&raquo; непонятно&#133 :)


 
FBuilder   (2008-01-16 19:15) [49]

Я не ошибся - я сделал! УРА!

Без паралельных потоков - все просто и правильно - все грузиться не напрямую в TSimpleDataSet, а в TClientDataSet но через TSQLQuery.
Пока оно не догрузиться, данные в TClientDataSet не изменяться, а соответственно и юзвер будет все видеть нормально без рывков.


 
FBuilder   (2008-01-16 19:16) [50]

> а как умудряются так часто вводить новые данные? прямая связь с мозгом таксиста?

Прямая связь с жопой таксиста лежит у меня сзади - GPS + датчик наличия пассажиров в салоне, что тоже будет добавляться в эту программу :)

А вообще - если при случае нужно будет что-то подобное - пишите - www.taxi-office.ru


 
FBuilder   (2008-01-16 19:17) [51]

Всем - спасибо!


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

> Я не ошибся &#151; я сделал! УРА!

Ура, ты сделал костыль. Покажи для интереса скрин формы с гридом этим, просто чтобы я для себя успокоился&#133


 
Kolan ©   (2008-01-16 19:18) [53]

> www.taxi-office.ru

От и скрины&#133


 
Kolan ©   (2008-01-16 19:20) [54]

Много не определил какая из сабжа&#133


 
Rater1   (2008-01-17 13:52) [55]

А ты пойди другим путём.
Возьми StringGrid и заполняй его анализом пришедшего select
по ID какому-нить...
Изменяющуюся запись цветом выделяй на пару секунд, типа поменялась...
Тогда ничего прыгать не будет


 
ketmar ©   (2008-01-17 15:15) [56]

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


 
clickmaker ©   (2008-01-17 15:34) [57]

я бы с ListView делал
на сервере:
пришел запрос - запись помечаем как измененную или запись добавляем
раз в сек делаем селект типа такого
select blabla from table where Modified = 1
выбранную инфу отдаем клиенту
на клиенте пробегаем по ListView. Если есть ID измененной записи, меняем ей цвет или иконку.
Если нет ID, добавляем строчку, делаем видимой
Потом можно по аналогии с почтовиком: юзер кликнул - update table set Modified = 0 where ID = @ID. Типа прочтенное, больше не беспокоить.

Еще вариант: прямо с сервера, куда заносятся данные как-то оповещать клиента, а потом уже заносить в базу. но тут все зависит от того, как между ними связь организована



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

Форум: "Базы";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.61 MB
Время: 0.047 c
2-1211624234
Magnit
2008-05-24 14:17
2008.06.22
Реализация задержки по выбору промежутка времени


2-1211854505
AlekseyB
2008-05-27 06:15
2008.06.22
DBGRID


2-1211698255
may be I am noob...
2008-05-25 10:50
2008.06.22
Юлианов День


2-1211959348
DmT
2008-05-28 11:22
2008.06.22
Терминал на канве


2-1211777186
Гена
2008-05-26 08:46
2008.06.22
Из TQuery в TQuery





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский