|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
AndreTMDmDeDВ книгах по Фоксу читал, но сейчас уже не помню в каких именно.Видимо, вы читали не те книги В книгах есть упомянутые фразы, но в данном случае они очень бездумно вырваны из контекста сказанного в книгах. DmDeD, советую перечитать и осмыслить все что написано про использование индексов. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 13:30 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
AndreTM, Спасибо за совет. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 13:34 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Dima T, Но основная проблема, как я понял, связанна с сеткой? Да пусть сейчас таблица непроиндексирована, но и в 20 раз быстрее выполняется запрос в одиночном режиме. Допускаю, что с индексами будет работать гораздо быстрее... Вот интересно проверить сколько покажет тестирование по времени в многопользовательском режиме... (меньше 8 минут?) Ещё раз спасбо за советы. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 13:40 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Dima T, с проиндексорованной таблицей получилось 1:28 вместо 2:35 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 13:51 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Dima TПровел тест. Исходные данные: Таблица со строками накладных размер 186 Мб, индексы 96 Мб. Положил ее на комп ничем не нагруженный. На своем компе открыл фокс и запускал замер по три раза для каждой ситуации. Условие выборки (nKol = 80) специально взял не попадающее в индексы (каждый раз фокс делал полный скан) чтоб тормозило заметнее. + Код замера Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Компы все с Win7x64 сетка 100 Мбит Результаты: 1. Таблица открыта только у меня: 22 сек, 1.1 сек, 1.1 сек 2. Открыл на втором (только use \\Server\Share\test.dbf shared): 55 сек, 55 сек, 55 сек 3. Закрыл на втором (use in test и закрыл фокс): 55 сек, 55 сек, 55 сек 4. Закрыл таблицу на своем (use in test): 22 сек, 1.1 сек, 1.2 сек Ну и трафик: 207 Мб скачано там где 22 и 55 сек, и 0 (ноль) там где 1 сек. Мои выводы: 1. С пунктом 3 никакой мистики нет. Так работает виндовс. Надо переоткрывать файл если кто-то его открыл/закрыл на другом компе. 2. Кэш на чтение есть. 3. Одновременное открытие на двух компах замедляет чтение (55 вместо 22 сек), т.е. кроме самого чтения еще идет какая-то работа на стороне сервера. 22 сек это предельная скорость, т.к. просто копирование ~10 Мб/сек, т.е. 207 Мб = 20.7 сек и сам запрос 1.1 сек. Остальные 33 сек. (55 - 22) это потери по вине виндовса на сервере, его расходы на расшаривание файла. Интересный тест. Интересно, а в приватной сессии то же самое или как. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 14:23 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
DmDeDНо основная проблема, как я понял, связанна с сеткой? Да DmDeDДопускаю, что с индексами будет работать гораздо быстрее... Вот интересно проверить сколько покажет тестирование по времени в многопользовательском режиме... (меньше 8 минут?) Создай индекс и проверь :) Индекс уменьшает нагрузку на сетку. Главное ускорение от индексов в том что фокс качает сначала индекс (не весь, а только нужную часть), получает из него какие записи надо скачать и затем качает только нужные, а не все. Например в твоем селекте: Код: sql 1. 2. 3.
без индекса: клиент полностью скачает к себе таблицу bd_schedules_apl_loc и после будет делать выборку перебором записей. Если бы был индекс по bd_schedules_apl_loc.apl_datego: клиент скачает индекс, получит какие записи нужны и скачает только эти записи. Т.е. чем меньше записей попадает под условие выборки тем быстрее будет выборка. Что касается ключевых индексов по справочникам (bd_schedules_otdels.apl_id и nsi_type_work.id_work) то у тебя фокс сначала скачивает всю таблицу, затем создает для нее временный индекс, о чем оптимизатор и написал: "Joining table nsi_type_work and table bd_schedules_otdels using temp index" Если бы индекс был, то был бы скачан индекс, а по нему только требуемые записи. Размеры индексов в разы меньше таблиц, да и поиск там идет не тупым перебором, поэтому при правильном использовании ускорение получается значительное. Например если продолжить мой тестовый пример и создать индекс по nKol, то в случае нескольких пользователей вместо 55 сек получается 6,1 сек и трафик 6.5 Мб вместо 207 Мб. (результат выборки 22 тыс. записей из 7.8 млн) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 14:24 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
AndreTMВидимо, вы читали не те книги Вам надо тему открыть "Правильное проектирование приложения в VFP" и там начать выкладывать свои познания. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 14:25 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Dima T, походу сначала придётся перепроектироваться всю структуру БД и понять, что индексировать возможно даже какие-то постоянные данные (например, НСИ "ОКАТО" или "Формы собственности") единажды переносить с сервера на станцию пользователя и открывать их с неё... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 14:33 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
sg12, ещё разок повторить, с кем не общаемся? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 14:34 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
DmDeDDima T, с проиндексорованной таблицей получилось 1:28 вместо 2:35 на 40% уже результат. Правда 1:28 тоже многовато. Думаю в твоем случае самый быстрый способ это один раз сделать предварительную выборку в курсор, курсор проиндексировать по дате, а затем из него строить отчет в циклах. Главный тормоз все-таки сетка. Если один твой запрос без индексов делается 6-7 сек. при этом затягивая всё на клиента, то предварительная выборка будет не намного дольше. Зато последующие из курсоров будут выполнятся намного быстрее и их скорость никак не будет зависеть от того сколько пользователей работает. Т.е. максимум должно получится нормальные для тебя 25 сек плюс 10-15 сек на предварительную выборку. Хотя возможно все вместе будет быстрее 25 сек. Если созреешь создать индексы для таблиц, то их обязательно надо обслуживать, т.е. периодически пересоздавать потому что: 1. Прога может вылететь не сохранив все данные и в результате имеем индекс не соответствующий данным (комп сглючил, сбой в сети, сервер перегрузили, пользователь снял задачу и т.д.) 2. Индексы "вырождаются" при интенсивном изменении данных, т.е. структура дерева индекса становится неэффективной и не дает максимально-возможной скорости выборки. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 14:49 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Dima T, да придётся это хоть как-то позволит решить сетевые проблемы но наверное я паралельно буду всё же часть таблиц локализовать, что бы в сети они вообще не участвовали я как-то больше отдавал приоритет интерфейсной часть программы, а программная всегда была на втором месте, т.к. пользователю первое важнее... ещё раз спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 15:02 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
DmDeDвозможно даже какие-то постоянные данные (например, НСИ "ОКАТО" или "Формы собственности") единажды переносить с сервера на станцию пользователя и открывать их с неё... Появятся еще и другие проблемы. Например - как сохранять их целостность, как обновлять эти справочники при необходимости и др. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 15:02 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
DmDeDпоходу сначала придётся перепроектироваться всю структуру БД и понять, что индексировать Структуру не надо менять. Минимально индекс должен быть на ключевом поле. А для остальных полей смотреть какие фильтры в запросах используются (WHERE) и для часто используемых полей добавлять индексы. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 15:04 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
sg12, ну на клиенте фокс не стоит и dbf штатными программаи не открывается, а пользователь вряд ли озадачится на тему изменения НСИ, хотя всё возможно.... а обновление происходит автоматически при запуске приложения (если файл на компе пользователя отличается от того, что выложен в сеть - идёт удаление и копирование но комп пользователя) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 15:11 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Dima T, Я предполагал проводить повторное индексирование на этапе администрирования в начале операционного дня ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 15:13 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Без обид, я немного не понял написаное тобой. Dima TПровел тест. Исходные данные: Таблица со строками накладных размер 186 Мб, индексы 96 Мб. Положил ее на комп ничем не нагруженный. На своем компе открыл фокс и запускал замер по три раза для каждой ситуации. Условие выборки (nKol = 80) специально взял не попадающее в индексы (каждый раз фокс делал полный скан) чтоб тормозило заметнее. + Код замера Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Компы все с Win7x64 сетка 100 Мбит Результаты: 1. Таблица открыта только у меня: 22 сек, 1.1 сек, 1.1 сек Явно кэш отработал во втором и третьем случае. Dima T2. Открыл на втором (только use \\Server\Share\test.dbf shared): 55 сек, 55 сек, 55 сек Ну а чё не пишешь, первый-то комп всё ещё пашет ? Пашет ТОЛЬКО второй комп ? Ну, чё, как дитё малое, нормально не можешь описать свой эксперимент и результаты ? Да пиши по-русски, в конце концов "Включил 1 комп, результаты такие-то, выключил его, включил второй комп - результаты твкие-то, включил задачу на двух компах - результаты такие-то...". Ну, фигня, согласись, то, что ты приложил (цифры) здесь, ну можно по-разному трактовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 15:29 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
rewareНу а чё не пишешь, первый-то комп всё ещё пашет ? Пашет ТОЛЬКО второй комп ? Ну, чё, как дитё малое, нормально не можешь описать свой эксперимент и результаты ? Да пиши по-русски, в конце концов "Включил 1 комп, результаты такие-то, выключил его, включил второй комп - результаты твкие-то, включил задачу на двух компах - результаты такие-то...". Ну, фигня, согласись, то, что ты приложил (цифры) здесь, ну можно по-разному трактовать. Я могу понять нежелание повторить, но нежелание просто внимательно прочитать написанное - это уже хамство. Вроде однозначно написал: Dima T На своем компе открыл фокс и запускал замер по три раза для каждой ситуации. т.е. тестовый код ВСЕ разы запускался на моем компе. На втором просто открывал/закрывал таблицу. Чего делал на втором тоже писал: Dima T1. Таблица открыта только у меня: 22 сек, 1.1 сек, 1.1 сек 2. Открыл на втором (только use \\Server\Share\test.dbf shared): 55 сек, 55 сек, 55 сек 3. Закрыл на втором (use in test и закрыл фокс): 55 сек, 55 сек, 55 сек 4. Закрыл таблицу на своем (use in test): 22 сек, 1.1 сек, 1.2 сек rewareНу, фигня, согласись, то, что ты приложил (цифры) здесь, ну можно по-разному трактовать. Давай свою трактовку. Только сначала перевари все что я написал. ЗЫ По времени в Хабаровске 12-й час ночи, ты сначала выспись, потом ответишь. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 16:12 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
DmDeDDima T, Я предполагал проводить повторное индексирование на этапе администрирования в начале операционного дня Обычно как-то так и делается. Раз в сутки достаточно. Я обычно делаю запуск заданием на сервере при включении сервера (если на ночь отключается) или ночью (если круглосуточно работает). Во втором случае возможно что кто-то из пользователей прогу не закроет, тогда проиндексировать не получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 16:34 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Обновляю индексы раз в неделю - (задание по выходным - Erase *.CDX), если все из проги вышли (бывает и такое) Но по этому поводу есть мнение, что у индексных файлов всего два состояния - рабочий и Нет. Смысл реиндекса ??? когда всё работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2013, 09:02 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
ЛюдмilaСмысл реиндекса ??? когда всё работает. ВладимирМ об этом говорил - при активной работе с записями (изменение полей, входящих в индексные выражения) структура индексного файла становится несбалансированной, что увеличивает время поиска в индексе. Поэтому периодическая реиндексация все же требуется. Другое дело, что можно индексировать таблицы с разной частотой - "сильнонагруженные" - чаще, а различные справочники, особенно всякие классификаторы и т.п. - значительно реже. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2013, 10:22 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Хмм! "Несбалансированная структура индексного файла" !?! Ну тогда Реиндекс - раз в неделю или почаще (в зависимости от интенсивности). Спасибочки! Вот перечитала всю имеющуюся в наличии увлекательную литературу по индексам (даже кажется поняла как это работает!) в связи с этим подправила их и where в запросах (и так было хорошо), но стало пошустрее раза в два-три (локально). у меня к базе подключаются до 40 пользователей, тормозов никаких не наблюдается. Правда сетка гиговая на 2-ух свичах DGS-24. в ходе работы в диспетчере задач (вкладка сеть) наблюдались мгновенные пики, порой до 40%. Конкретно работала по ним, по сетке пока не тестировала - Выходные! (Кстати 1С грузит сетку до 30% и это не пики, а волна протяженностью по 3-7сек. Ужасно! Ладно хоть их мах. до 5-ти машин.) Приблизительно такие же несколько crazy-запросов (как опубликованный выше, который собрали - "лишь бы работал") тоже попили кровушки, но вплотную занявшись ими добивались поразительных результатов. Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2013, 17:49 |
|
|
start [/forum/topic.php?fid=41&msg=38116768&tid=1583216]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
58ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
71ms |
get tp. blocked users: |
1ms |
others: | 276ms |
total: | 456ms |
0 / 0 |