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



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

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

Наверх




Память: 0.56 MB
Время: 0.042 c
3-1200756387
IvanCoFox
2008-01-19 18:26
2008.06.22
Проблемы с AnyDAC и MySQL


2-1212014851
ply
2008-05-29 02:47
2008.06.22
аналог in_array в php


15-1210756224
User1
2008-05-14 13:10
2008.06.22
Как программно выключить сервер ?


15-1210277107
AlexDan
2008-05-09 00:05
2008.06.22
Графический файл на фотоаппарат.


15-1210461071
Basis
2008-05-11 03:11
2008.06.22
Как лучше сделать классу интерфейс?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский