|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Есть большой приложение, в котором работают одновременно до 10 пользователей. Это что-то типа "псевдосетевой" версии. Быстро работает только на том компьютере на котором эти DBF расположены, на остальным компах раз в 10 наверное медленней работает. Таблиц в принципе много, но рабочая таблица всего одна и она динамически создаётся каждый день новая, то бишь на каждый день своя DBF, количество записей не более 1000, сама по себе запись не большая. Вот из процедуры создания можно увидеть структуру: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Сама программа представляет из себя форма, на ней Grid, в котором всё крутится в реальном времени со своими программными блокировками. Куда копать и что делать не знаю. P.S. Программе уже лет 5 наверное или около тога и пользователи в принципе уже привыкли к тормозам, но думаю может быть знатоки смогут помочь мне в ускорении работы приложения, если что отвечу на все вопросы, но весь код программы выкладывать это конечно очень много... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2015, 13:38 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Тормозит что? Перемещение по гриду? Во время перемещения есть обращения к другим таблицам? Как именно прописано? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2015, 13:48 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima TТормозит что? Перемещение по гриду? Во время перемещения есть обращения к другим таблицам? Как именно прописано? Тормозит всё и перемещение и изменение ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2015, 13:57 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Событие AfterRowColChange Код: sql 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. 40. 41. 42. 43. 44. 45.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2015, 13:59 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
И ещё большая процедура на LostFocus 6 колонки Grida из поля Text: Код: sql 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. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2015, 14:01 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Если сомневаешься что конкретно выполняется в твоем коде, то можешь профилирофщиком посмотреть: настраиваешь исходники на рабочую базу, запускаешь свою форму, затем меню Tools-Debugger там меню Tools-Coverage Logging задаешь файл куда лог писать. Затем возвращаешься на форму и делаешь действия на которых тормозит. Переключаешься в дебагер и отжимаешь кнопку писания лога на тулбаре (или просто все закрой) Дальше смотришь лог, первая цифра сколько времени выполнялась строка кода, дальше где эта строка, последняя цифра уровень вложенности. Есть какая-то софтина для более удобного просмотра лога, только не помню как запустить, не пользуюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2015, 14:03 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKESСобытие AfterRowColChange ... Ты уверен что весь этот код надо выполнять при каждом переходе на другую клетку? Это зачем: Код: sql 1. 2.
Используй алиасы, т.е. при открытии Код: sql 1. 2.
а в коде Код: sql 1.
и тебе точно надо всю таблицу апдейтить или достаточно текущую строку? Если текущую, то изучай REPLACE Если надо всю - проверь что есть индекс по полю BLOK Тут может быть тормоз Код: sql 1.
Размеры таблицы saldo какой? Если от 100 строк то тоже индексы надо делать. В целом как-то коряво все спроектировано. Не надо столько сложных действий в AfterRowColChange() пихать. Это выкинь Код: sql 1. 2.
сделай индекс и используй IndexSeek() ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2015, 14:24 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
[quot Dima T]AngelOKESСобытие AfterRowColChange ... Ты уверен что весь этот код надо выполнять при каждом переходе на другую клетку? Это зачем: Код: sql 1. 2.
Используй алиасы, т.е. при открытии Код: sql 1. 2.
Не удобно переключать с одной таблицы на другую ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2015, 15:12 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Что я не так делаю? Код: sql 1. 2. 3.
Программа не может найти этот алиас... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2015, 15:15 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Надо Код: sql 1.
Если в процессе работы постоянно открываются разные таблицы ZakazXXXX то оставь как было. На производительность это не сильно влияет. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2015, 15:19 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima TС индексами разбирайся. Запросы посмотри как отрабатывают. SYS(3054) показывает какие индексы используются в запросе. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2015, 15:31 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, не хотелось бы использовать индексы, хотя таблица saldo содержит свыше 1000 записей и самое интересное что как бы не нагружать программу, на основном компьютере всё будет в 10-раз быстрее пробовал делать центром любой другой компьютер, то тогда ускорялся именно он, может я что-то не использую в коде или наоброт использую то что именно по сети тормозит? А на счёт индексов я всё таки думаю, что тормозили бы все, если бы была проблема только в индексах. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 06:36 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKESи самое интересное что как бы не нагружать программу, на основном компьютере всё будет в 10-раз быстрее Предоставь возможность доступа Dima T к main компьютеру и хотя бы одному клиентскому и будет тебе счастье ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 07:42 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKESи самое интересное что как бы не нагружать программу, на основном компьютере всё будет в 10-раз быстрее Предоставь возможность доступа Dima T к main компьютеру и хотя бы одному клиентскому и будет тебе счастье И думаю было бы уместно /но вовсе не обязательно/ после помощи Dima T его поблагодарить и рассказать в назидание другим про "грабли" ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 07:49 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKESDima T, не хотелось бы использовать индексы, хотя таблица saldo содержит свыше 1000 записей Оптимизатор запросов работает только с помощью индексов. Вот один из твоих тормозов Код: sql 1.
Без индексов каждый раз происходит полный скан таблицы, т.е. даже если тебе нужна только одна строка - читается (качается по сети) вся таблица, затем выбирается нужная запись. При наличии индекса - из индекса выбираются координаты нужных записей и читаются только эти записи. попробуй создать индекс Код: sql 1. 2.
и посмотри как будет работать. В идеале надо такой индекс Код: sql 1.
дальше так Код: sql 1. 2. 3. 4. 5. 6. 7.
Боятся индексов не надо. Надо просто разобраться как ими пользоваться и как обслуживать (плановая переиндексация, контроль снятия задачи пользователем и т.д.). AngelOKESи самое интересное что как бы не нагружать программу, на основном компьютере всё будет в 10-раз быстрее пробовал делать центром любой другой компьютер, то тогда ускорялся именно он, может я что-то не использую в коде или наоброт использую то что именно по сети тормозит? А на счёт индексов я всё таки думаю, что тормозили бы все, если бы была проблема только в индексах. Это особенность работы виндовса: Если файл открывает один пользователь, то файл кэшируется на его стороне. Тормозить не будет даже по сети. Чтение идет даже не с диска, а из кэша своего виндовса. Когда файл открывает второй (третий и т.д.) пользователь - включается контроль блокировок и скорость чтения резко падает. По сети 100 МБит скорость чтения от силы 10-20. Можешь глянуть размер saldo.dbf и прикинуть сколько времени надо на его чтение. Скорость ~1 Мбайт в секунду. Если файл расположен на том же компе - работает чуть быстрее, но опять же не со скоростью чтения с винта, а 3-5 Мбайт в секунду. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 07:56 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Владимир2012AngelOKESи самое интересное что как бы не нагружать программу, на основном компьютере всё будет в 10-раз быстрее Предоставь возможность доступа Dima T к main компьютеру и хотя бы одному клиентскому и будет тебе счастье И думаю было бы уместно /но вовсе не обязательно/ после помощи Dima T его поблагодарить и рассказать в назидание другим про "грабли" Поблагодарить я всегда рад, я благодарю и Dima T и вас я тоже благодарю!!! Но вот даже если я дам доступ по сети, что можно будет увидеть, я не против показать код и объяснить всю логику работы программы или есть какие-то инструменты которые помогут удалённо разобраться в ситуации? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 07:56 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKES или есть какие-то инструменты которые помогут удалённо разобраться в ситуации?К примеру https://www.teamviewer.com/ru/ ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 08:04 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, Можно ли создавать индекс вот так: Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 08:05 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Эта конструкцию можно немного соптимизировать даже без индексов Код: sql 1. 2. 3. 4.
так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
тормозить будет на locate но он будет отрабатывать если текущая запись не та что надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 08:07 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, Тогд процедуру перемещения по таблице я тоже сокращаю и делаю такой: Код: sql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 08:10 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, Да забыл написать как я переделал под Alias разные таблицы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 08:13 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKESя не против показать код и объяснить всю логику работы программы или есть какие-то инструменты которые помогут удалённо разобраться в ситуации? Типа поработайте за меня а я скажу спасибо? Не, братец, тут форум чтобы помочь разобраться и дальше самому свою работу делать. Если хочешь чтоб за тебя поработали - есть форум "работа", там за вознаграждение покопаются в твоих исходниках. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 08:16 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima TAngelOKESя не против показать код и объяснить всю логику работы программы или есть какие-то инструменты которые помогут удалённо разобраться в ситуации? Типа поработайте за меня а я скажу спасибо? Не, братец, тут форум чтобы помочь разобраться и дальше самому свою работу делать. Если хочешь чтоб за тебя поработали - есть форум "работа", там за вознаграждение покопаются в твоих исходниках. Это я Владимиру написал, да и так конечно я сам понимаю, что я сам должен разобраться во всём... Сейчас во всем коде меняю UPDATE на Replace, надеюсь это ускорит работу программы :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 08:20 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKESDima T, Можно ли создавать индекс вот так: Лучше так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
т.к. Use ... Excl невозможно сделать если кто-то уже открыл таблицу как Shared, то этот код надо выполнять в то время когда никто не работает. Например ночью из планировщика. Ежедневное пересоздание нужно потому что в процессе изменения данных индексы вырождаются и эффективность их использования снижается. И предусмотреть возможность запустить принудительно руками в рабочее время, на случай если какой-то сбой железа произойдет и индексы попортятся. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 08:27 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKESСейчас во всем коде меняю UPDATE на Replace, надеюсь это ускорит работу программы :) ускорит, если Replace текущей записи. Если Replace for ..., то UPDATE предпочтительнее, т.к. есть ньюансы с блокировками. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 08:29 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, Про Excl я знаю, я обычно такие процедуры делаю на открытии и приобновлении программы все закрывают программу и главный компьютер запускает программу, далее запускаются другие и у них этот код уже естественно выполнятся не будет... Просто установку программу я часто делаю удалённо или приезжаю на место, а так чтобы в реальном времени доступа у меня нет к базе. А про REPLACE с использованием FOR, то получается мало где менять, обычно у меня всего стоит условие. Элементарно даже проверка блокировки Код: sql 1. 2.
Первая строчка стимает блок со всех записей данного оператора Вторая строчка ставит блок на текущую запись, НО если она уже не заблокирована другим оператором... Получается что мне стоит вернутся к UPDATE ? Так как без FOR я REPLACE использовать никак не могу ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 08:40 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKESDima T, Да забыл написать как я переделал под Alias разные таблицы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Еще хуже сделал. Зачем? Чтобы враг сломал мозг читая твои исходники? :) Я тебе предлагал алиас чтобы уйти от постоянных макроподстановок, а ты их только больше сделал. Раз уж у тебя куча файлов Zakaz_*.dbf и все нужны, то сделай так чтобы имя файла совпадало с алиасом, т.е. Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
addbs() добавляет \ если его нет ! (not) равносильно =.F. макроподстановками (&) не злоупотребляй, в большинстве случаев достаточно указать имя переменной в скобках, так быстрее работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 08:45 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKESПолучается что мне стоит вернутся к UPDATE ? Так как без FOR я REPLACE использовать никак не могу Лучше вернуться к UPDATE, т.к. по скорости одинаково, но без побочных эффектов. PS Думаю тебе не помешает книжку какую-нибудь почитать для систематизации твоих знаний. Рекомендую эту ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 08:55 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, Так мне очень помог алиас, я ведь раньше каждый раз определял имя таблицы, а теперь только один раз при открытии формы и при смене даты. У меня код сократился благодаря этому. А макроподстановку сейчас попробую убрать, не думал что она кушает много памяти ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 08:58 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima TAngelOKESПолучается что мне стоит вернутся к UPDATE ? Так как без FOR я REPLACE использовать никак не могу Лучше вернуться к UPDATE, т.к. по скорости одинаково, но без побочных эффектов. PS Думаю тебе не помешает книжку какую-нибудь почитать для систематизации твоих знаний. Рекомендую эту Ладно понял, больше не надоедаю ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 09:03 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKESмакроподстановку сейчас попробую убрать, не думал что она кушает много памяти Она не память кушает, он заставляет перекомпилировать строку кода. Отсюда задержки. Небольшие, но если код часто выполняется, то ощутимые. Т.е. код Код: sql 1. 2.
сначала превращается в Код: sql 1.
затем компилируется, а только после этого выполняется. это компилируется во время компиляции программы, а во время работы сразу выполняется Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 09:05 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T Код: sql 1.
Гм. У меня и в голове не укладывается как можно этого не знать - ведь это азы. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 09:12 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, Блин тогда не получиться... Получается как я могу определить переоткрывать мне новый файл или использовать существующий? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 09:12 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKESDima T, Блин тогда не получиться... Получается как я могу определить переоткрывать мне новый файл или использовать существующий? Что не получится? Ты бы хоть ссылку давал к какому посту камент. Если к этому 18079244 то получится, т.к. алиас автоматом создается такой же как имя таблицы, т.е. имя файла без расширения. Но если имя файла содержит недопустимые символы (точки, начинается с цифры и т.д.) то алиас генерится фоксом. проверить просто Код: sql 1. 2. 3. 4.
А если ты точно знаешь алиас, то проверить открыт он или нет элементарно Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 09:25 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, Как мне уйти от этой макроподстановки? - &mNameZ Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 09:28 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Указывать переменную в скобках т.е. вместо &mNameZ писать (mNameZ) Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 09:33 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima TУказывать переменную в скобках т.е. вместо &mNameZ писать (mNameZ) Код: sql 1.
Работает!!!! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 09:43 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, Вот теперь так выглядит процедуры Init у формы: Код: sql 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. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75.
А так выглядит главная процедура обновления данных на форме: Код: sql 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. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 09:47 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Когда хочешь много кода показать - прячь под спойлер (пункт spoiler в "дополнит.") AngelOKESDima T, Вот теперь так выглядит процедуры Init у формы: Init() Код: sql 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. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75.
Если работает - значит нормально. Если хочешь тормоза потестить - возьми копию реальной базы, запусти две копии своей проги, или еще проще запусти вторую копию фокса и открой там те таблицы, которые участвуют в работе Код: sql 1. 2. 3. 4.
так виндовс перейдет в тормозной режим затем переключайся в свою прогу и пробуй работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 10:03 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, Нет такой вариант не прокатит, 2 копии программы на одном компьютере работают отлично, а вот если на двух компах по сети, то картина такая же будет наверное, надо будет подумать как можно сейчас это реализовать... можно конечно скинуть обновление операторам и они в реальном времени проверят, но как-то это не красиво... Ладно сейчас что-нибудь придумаю... А дальше там уже будем дальше думать что ещё можно сделать существенного для прироста скорости на клиентах ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 10:33 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKESа вот если на двух компах по сети Сделай виртуалку, поставь туда винду и положи туда базу. Сетевые интерфейсы у виртуалок достаточно тормозные. Будет почти как по сети, не намного быстрее. AngelOKESА дальше там уже будем дальше думать что ещё можно сделать существенного для прироста скорости на клиентах Кардинальное решение без переписывания проги: переход на терминал. На главный комп (где база) все заходят терминалом, запускают прогу и работают. Так получится что на одном компе запустили несколько копий проги. По сети ни одна копия ничего передавать не будет. Ну и промежуточный вариант: переход на гигабитную сетку. Гигабитное оборудование не дорогое. Скорее всего у большинства пользователей сетевухи гигабитные, останется только свич заменить. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 10:44 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, По поводу гигабитки это конечно я сам думаю что будет круто, но вот компы там старые и слабые и карточки почти везде 100 Мбит, свич само собой тоже менять надо. но как вариант предложу директору, попробую обосновать это ускорением программы... Ладно думаю через несколько дней смогу закончить тест, сейчас ещё пока переписываю, но даже то что мне не нужно каждый раз узнать имя таблицы мне дало значительное уменьшение кода, так как он у меня наверное раз 100 прописан в разных процедурах, коих у меня безмерное количество на форме.... Я вот подумал может быть стоит привязать объекты на форме к курсору, даст ли это прирост или можно не курсору, а прямо к выбранной таблице? Я сейчас напомню про какие элементы я говорю: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Ну и может быть и столбцы Grida тоже привязать: Код: sql 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.
Даст ли это ускорение или не стоит даже думать? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 11:00 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKESДаст ли это ускорение или не стоит даже думать? Ускорения не будет, будет чуть меньше кода. Главные тормоза от SELECT/UPDATE по сети. Это надо лечить, а на остальное не заморачивайся. По хорошему надо внимательно изучить код выполняющийся часто (AterRowColChange(), методы контролов грида) и оптимизировать этот код. Перед тем как что-то посчитать проверять а не посчитано ли оно ранее. Например AterRowColChange() срабатывает даже если ты перемещаешься в пределах одной записи, т.е. при переходе вправо/влево, думаю вполне реально при переходе на запись выполнить для нее расчет один раз, запомнить результаты и пользоваться ими пока курсор ходит в пределах записи. При переходе по контролам ничего не делать если ничего не вводили. В общем расчеты должны происходить только тогда когда они необходимы. Насоздавай свойств форме для хранения промежуточных расчетов и не бойся что из-за них будут тормоза. Один лишний SELECT по сети намного дольше чем чтение/изменение сотни свойств формы. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 12:06 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, Я вот что ещё думаю, может быть стоит ли как-то отказаться от курсора и работать напрямую с таблицей. А то у меня получается какая логика: 1) Нахожу нужный файл ZakazXXXXXX 2) Открываю его в рабочей области mZakazXXXXXX 3) Делаю запрос: Код: sql 1. 2. 3. 4.
4) Делаю необходимые фильтры (а их у меня может быть очень много, но здесь и далее я работаю уже с курсором "qZakaz" 5) При обновлении данных я делаю изменения как в этом курсоре, так и в оригинальной таблице. Код: sql 1. 2. 3.
Может стоит подумать как здесь можно оптимизировать или всё таки не стоит копать в этом направлении? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 12:25 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
От курсора не стоит отказываться, т.к. это и есть оптимизация, без него будет медленнее, т.к. каждый раз по сети будешь лезть в таблицу. Операции с курсором выполняются быстро т.к. он находится в кэше фокса (даже не виндовса). оптимизировать можно это индексом по kod или BLOK или kod+BLOK (в этом случае при сравнении должен совпадать синтаксис индекса с указываемым во Where, иначе оптимизатор индекс не задействует) Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2015, 12:41 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, Столнулся с такой проблемой, что даже с условием нужных программных блокировок записей происходи видоизменение записи несколькими диспетчерами и конечный результат не так очивиден... Приведу пример, логика программы у меня такая (просто напомню на всякий случай) 1) Есть таблица Zakaz-XX-XX-XX 2) Делаю перезаписываемый курсов на основе этой таблице 3) Далее на клиенте отображаю данный курсор, при изменении данных я меняю их как физически в самой таблице, так и в курсоре на локалке. Что у нас получается, при нахождение Диспетчера №1 в записи №1 он ставит на неё блок и на момент занесения изменений никто не может изменить этй запись!!! Далее Диспетчер №1 переходит на запись №2, а Диспетчер №2 переходит на запись №1, запись уже разблокирована Диспетчером №1 и ставиться блок Диспетчера №2, тут как бы всё ровно, НО Диспетчер №2 не видит тех изменений, которые сделал Диспетчер №1 и делает какие-то свои действия, которые не противоречат алгоритму программы и тех.задания, блокировка держиться только при нахождении в текущей записи и незалокированной другим диспетчером. В это же время Диспетчер №1 хочет сделать какой-то отчет по заказу №1, но данные уже конечно используются, те, которые внёс Диспетчер №2 и вводит его в заблуждение. Какждый раз запрашивать данные это будут тормоза... Я не могу придумать алгоритм реального обновления данных... У меня есть только частичное решение, когда Диспетчер №1 пытается изменить текст заказа, то при изменение я делаю запрос на блокировку и если она заблокирована другим диспетчером, то выдаю сообщение и обновляю текст заказа на тот, который сейчас стоит у заблокировавшего диспетчера... Но каждый раз запрашивать данные о записи это всегда тормоза, может быть есть более изящное решение? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2015, 14:10 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
По-хорошему надо делать так: встал на строку - заблокировал, уходя со строки блокировка остается если были изменения , если не было - освобождается. По окончании как понимаю происходит какое-то сохранение набранного, после этого сохранения блокировки снимаются. Глубоко не вникал в твою логику. У тебя вопрос был про ускорить. Если не так понимаю - распиши поподробнее свой механизм блокировок. Если не путаю встроенный механизм блокировок (rlock()/unlock) у тебя не используется, а есть какое-то поле BLOK куда ты пишешь что запись заблокирована. В любом случае надо делать так написал выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2015, 15:39 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKES) Делаю перезаписываемый курсов на основе этой таблице 3) Далее на клиенте отображаю данный курсор, при изменении данных я меняю их как физически в самой таблице, так и в курсоре на локалке. ... Я не могу придумать алгоритм реального обновления данных... У меня есть только частичное решение, когда Диспетчер №1 пытается изменить текст заказа, то при изменение я делаю запрос на блокировку и если она заблокирована другим диспетчером, то выдаю сообщение и обновляю текст заказа на тот, который сейчас стоит у заблокировавшего диспетчера... Но каждый раз запрашивать данные о записи это всегда тормоза, может быть есть более изящное решение? Кажется понял о чем речь. Тебе строку надо перечитать. Это не должно тормозить. Используй recno() Изначально делаешь курсор так Код: sql 1.
Обновление текущей строки курсора в BeforeRowColChange() Код: sql 1. 2.
и в обратную сторону можно также Код: sql 1. 2.
Можно заменить курсор на курсор-адаптер. Тогда курсор-адаптер будет этим заниматься .RecordRefresh() ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2015, 15:59 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, не получается без макроподстановки: Код: sql 1. 2. 3.
И данные всё равно обновляются после выхода из записи или просто мне надо как-то обновить Grid ещё, но его обновление также не помогает, хотелось бы чтобы при входе в запись уже менялось его значение на реальное. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2015, 07:15 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKESDima T, не получается без макроподстановки: Код: sql 1. 2. 3.
Можно так Код: sql 1. 2. 3. 4. 5.
AngelOKESИ данные всё равно обновляются после выхода из записи или просто мне надо как-то обновить Grid ещё, но его обновление также не помогает, хотелось бы чтобы при входе в запись уже менялось его значение на реальное. Ты откуда этот код вызываешь? Из BeforeRowColChange() ? 1. Убедись что запись в курсор происходит. Добавь после repl для отладки Код: sql 1.
2. Refresh() каждый раз не лучшее решение, попробуй писать сразу объекты грида, т.е. вместо repl Код: sql 1. 2. 3. 4. 5.
Не поможет - попробуй repl добавить. Grid иногда очень непонятно себя ведет, поэтому если не поможет - делай простенькую формочку с эмитацией твоей проблемы, выкладывай сюда, будем искать выход на реальном примере. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2015, 07:49 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, Он мне выбирает предыдущее значение, ничего не понимаю, как так-то... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2015, 08:29 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Из DBF предыдущее? Посмотри, может буферизация включена Код: sql 1.
Что выдает? Надо 1 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2015, 08:40 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKES, Вывожу сообщение: Код: sql 1.
и сразу видно, что он использует предыдущий код, может тупо сделать +1, но тут уверенности куда пойдёт пользовать вниз, вверх тлт просто ткнёт мышкой ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2015, 08:41 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, Так и есть: 1 – Row and table buffering is off. (Default) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2015, 08:45 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, У меня в начале программы стоит: Код: sql 1.
Если честно не помню откуда я это взял, может это как-то влияет? сейчас напишу все ключи Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2015, 08:47 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKESAngelOKES, Вывожу сообщение: Код: sql 1.
и сразу видно, что он использует предыдущий код, может тупо сделать +1, но тут уверенности куда пойдёт пользовать вниз, вверх тлт просто ткнёт мышкой Это значит ты еще не ушел с предыдущей строки, когда код отрабатывает. Выводишь откуда? Где поставил Messagebox() ? тупо +1 не надо. На крайний случай можно изврат с таймером сделать, но сначала без него надо попытаться порешать. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2015, 08:47 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, Вся процедура стоит конечно же в Grid на собитие BeforeRowColChange Отрабатывает эта процедура когда пользователь перемещается по гриду вниз или вверх Значение он действительно берёт из записи из которой выходит, а не заходит, проверил и вашим методом и своим ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2015, 08:50 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKESDima T, У меня в начале программы стоит: Это нормально, стандартные сеты. Туда пока не заглядывай. Надо с этим разбираться 18183244 Похоже ты не ту строку меняешь, поэтому нужная не меняется. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2015, 08:50 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Похоже я затупил :) BeforeRowColChange() срабатывает на старой записи перед уходом с нее. Надо в AfterRowColChange() прописывать обновление курсора, а в BeforeRowColChange() сохранение результата в таблицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2015, 08:58 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima TПохоже я затупил :) BeforeRowColChange() срабатывает на старой записи перед уходом с нее. Надо в AfterRowColChange() прописывать обновление курсора, а в BeforeRowColChange() сохранение результата в таблицу. Я тоже так подумал, сейчас попробую! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2015, 09:01 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
И добавь проверку чтобы по несколько раз не писать одно и тоже. Тормозов меньше будет Добавь форме свойство nLastRow = 0 в коде так использовать Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2015, 09:12 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, Да всё работает, а проверка у меня на это событие уже было, получилось что-то вроде этого: Код: sql 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. 40. 41. 42. 43.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2015, 09:14 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
Dima T, Пришлось всё таки вернуть: Код: sql 1.
Иначе при повторном входе значение меняется на старое, а с этой строчкой всё ровно, немного непонятно, но вроде работает! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2015, 09:18 |
|
Как ускорить работы с работой с DBF по сети
|
|||
---|---|---|---|
#18+
AngelOKESс этой строчкой всё ровно, немного непонятно, но вроде работает! Объекты грида и данные из источника (курсора) хоть и синхронизируются, но не постоянно. Поэтому иногда возможна ситуация что данные в источнике изменились, а грид это не перерисовал. Для этого нужна эта строчка. Можно Refresh() но это более тяжелая операция, т.к. он сразу все видимые строки перерисовывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2015, 09:25 |
|
|
start [/forum/topic.php?all=1&fid=41&tid=1582258]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
76ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
77ms |
get tp. blocked users: |
1ms |
others: | 299ms |
total: | 492ms |
0 / 0 |