|
Как ускорить работы с работой с 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 |
|
|
start [/forum/topic.php?fid=41&msg=39038053&tid=1582258]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
158ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 311ms |
total: | 574ms |
0 / 0 |