powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос к таблице в общем доступе
21 сообщений из 71, страница 3 из 3
Запрос к таблице в общем доступе
    #38109138
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTMDmDeDВ книгах по Фоксу читал, но сейчас уже не помню в каких именно.Видимо, вы читали не те книги
В книгах есть упомянутые фразы, но в данном случае они очень бездумно вырваны из контекста сказанного в книгах.
DmDeD, советую перечитать и осмыслить все что написано про использование индексов.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109147
DmDeD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM,

Спасибо за совет.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109155
DmDeD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

Но основная проблема, как я понял, связанна с сеткой?
Да пусть сейчас таблица непроиндексирована, но и в 20 раз быстрее выполняется запрос в одиночном режиме.
Допускаю, что с индексами будет работать гораздо быстрее... Вот интересно проверить сколько покажет тестирование по времени в многопользовательском режиме... (меньше 8 минут?)

Ещё раз спасбо за советы.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109178
DmDeD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

с проиндексорованной таблицей получилось 1:28 вместо 2:35
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109231
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПровел тест.
Исходные данные:
Таблица со строками накладных размер 186 Мб, индексы 96 Мб. Положил ее на комп ничем не нагруженный.
На своем компе открыл фокс и запускал замер по три раза для каждой ситуации. Условие выборки (nKol = 80) специально взял не попадающее в индексы (каждый раз фокс делал полный скан) чтоб тормозило заметнее.
+
Код замера
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
if !used('test')
	use \\Server\Share\test.dbf shared
endif

if used('result')
	use in result
endif
lnSec = seconds()
select * from test where nKol = 80 into cursor result
? seconds() - lnSec


Компы все с 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) это потери по вине виндовса на сервере, его расходы на расшаривание файла.

Интересный тест.
Интересно, а в приватной сессии то же самое или как.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109235
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmDeDНо основная проблема, как я понял, связанна с сеткой?
Да
DmDeDДопускаю, что с индексами будет работать гораздо быстрее... Вот интересно проверить сколько покажет тестирование по времени в многопользовательском режиме... (меньше 8 минут?)
Создай индекс и проверь :) Индекс уменьшает нагрузку на сетку.
Главное ускорение от индексов в том что фокс качает сначала индекс (не весь, а только нужную часть), получает из него какие записи надо скачать и затем качает только нужные, а не все.
Например в твоем селекте:
Код: sql
1.
2.
3.
SELECT ...;
FROM bd_schedules_apl_loc;
WHERE bd_schedules_apl_loc.apl_datego BETWEEN pdDateRepStart AND pdDateRepFinish


без индекса: клиент полностью скачает к себе таблицу 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 млн)
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109240
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTMВидимо, вы читали не те книги


Вам надо тему открыть "Правильное проектирование приложения в VFP" и там начать выкладывать свои познания.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109260
DmDeD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

походу сначала придётся перепроектироваться всю структуру БД и понять, что индексировать

возможно даже какие-то постоянные данные (например, НСИ "ОКАТО" или "Формы собственности") единажды переносить с сервера на станцию пользователя и открывать их с неё...
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109261
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12, ещё разок повторить, с кем не общаемся?
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109299
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmDeDDima T,

с проиндексорованной таблицей получилось 1:28 вместо 2:35
на 40% уже результат. Правда 1:28 тоже многовато.
Думаю в твоем случае самый быстрый способ это один раз сделать предварительную выборку в курсор, курсор проиндексировать по дате, а затем из него строить отчет в циклах. Главный тормоз все-таки сетка. Если один твой запрос без индексов делается 6-7 сек. при этом затягивая всё на клиента, то предварительная выборка будет не намного дольше. Зато последующие из курсоров будут выполнятся намного быстрее и их скорость никак не будет зависеть от того сколько пользователей работает. Т.е. максимум должно получится нормальные для тебя 25 сек плюс 10-15 сек на предварительную выборку. Хотя возможно все вместе будет быстрее 25 сек.

Если созреешь создать индексы для таблиц, то их обязательно надо обслуживать, т.е. периодически пересоздавать потому что:
1. Прога может вылететь не сохранив все данные и в результате имеем индекс не соответствующий данным (комп сглючил, сбой в сети, сервер перегрузили, пользователь снял задачу и т.д.)
2. Индексы "вырождаются" при интенсивном изменении данных, т.е. структура дерева индекса становится неэффективной и не дает максимально-возможной скорости выборки.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109346
DmDeD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

да придётся
это хоть как-то позволит решить сетевые проблемы
но наверное я паралельно буду всё же часть таблиц локализовать, что бы в сети они вообще не участвовали

я как-то больше отдавал приоритет интерфейсной часть программы, а программная всегда была на втором месте, т.к. пользователю первое важнее...

ещё раз спасибо!
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109349
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmDeDвозможно даже какие-то постоянные данные (например, НСИ "ОКАТО" или "Формы собственности") единажды переносить с сервера на станцию пользователя и открывать их с неё...

Появятся еще и другие проблемы.
Например - как сохранять их целостность, как обновлять эти справочники при необходимости и др.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109355
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmDeDпоходу сначала придётся перепроектироваться всю структуру БД и понять, что индексировать
Структуру не надо менять.
Минимально индекс должен быть на ключевом поле. А для остальных полей смотреть какие фильтры в запросах используются (WHERE) и для часто используемых полей добавлять индексы.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109383
DmDeD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sg12,

ну на клиенте фокс не стоит и dbf штатными программаи не открывается, а пользователь вряд ли озадачится на тему изменения НСИ, хотя всё возможно....
а обновление происходит автоматически при запуске приложения (если файл на компе пользователя отличается от того, что выложен в сеть - идёт удаление и копирование но комп пользователя)
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109390
DmDeD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

Я предполагал проводить повторное индексирование на этапе администрирования в начале операционного дня
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109427
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без обид, я немного не понял написаное тобой.
Dima TПровел тест.
Исходные данные:
Таблица со строками накладных размер 186 Мб, индексы 96 Мб. Положил ее на комп ничем не нагруженный.
На своем компе открыл фокс и запускал замер по три раза для каждой ситуации. Условие выборки (nKol = 80) специально взял не попадающее в индексы (каждый раз фокс делал полный скан) чтоб тормозило заметнее.
+
Код замера
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
if !used('test')
	use \\Server\Share\test.dbf shared
endif

if used('result')
	use in result
endif
lnSec = seconds()
select * from test where nKol = 80 into cursor result
? seconds() - lnSec


Компы все с Win7x64 сетка 100 Мбит

Результаты:
1. Таблица открыта только у меня: 22 сек, 1.1 сек, 1.1 сек
Явно кэш отработал во втором и третьем случае.
Dima T2. Открыл на втором (только use \\Server\Share\test.dbf shared): 55 сек, 55 сек, 55 сек
Ну а чё не пишешь, первый-то комп всё ещё пашет ? Пашет ТОЛЬКО второй комп ? Ну, чё, как дитё малое, нормально не можешь описать свой эксперимент и результаты ? Да пиши по-русски, в конце концов "Включил 1 комп, результаты такие-то, выключил его, включил второй комп - результаты твкие-то, включил задачу на двух компах - результаты такие-то...". Ну, фигня, согласись, то, что ты приложил (цифры) здесь, ну можно по-разному трактовать.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109533
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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-й час ночи, ты сначала выспись, потом ответишь.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109580
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmDeDDima T,

Я предполагал проводить повторное индексирование на этапе администрирования в начале операционного дня
Обычно как-то так и делается. Раз в сутки достаточно.
Я обычно делаю запуск заданием на сервере при включении сервера (если на ночь отключается) или ночью (если круглосуточно работает). Во втором случае возможно что кто-то из пользователей прогу не закроет, тогда проиндексировать не получится.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38116753
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обновляю индексы раз в неделю - (задание по выходным - Erase *.CDX), если все из проги вышли (бывает и такое)
Но по этому поводу есть мнение, что у индексных файлов всего два состояния - рабочий и Нет.
Смысл реиндекса ??? когда всё работает.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38116768
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛюдмilaСмысл реиндекса ??? когда всё работает. ВладимирМ об этом говорил - при активной работе с записями (изменение полей, входящих в индексные выражения) структура индексного файла становится несбалансированной, что увеличивает время поиска в индексе. Поэтому периодическая реиндексация все же требуется. Другое дело, что можно индексировать таблицы с разной частотой - "сильнонагруженные" - чаще, а различные справочники, особенно всякие классификаторы и т.п. - значительно реже.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38116948
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хмм! "Несбалансированная структура индексного файла" !?!
Ну тогда Реиндекс - раз в неделю или почаще (в зависимости от интенсивности).
Спасибочки!

Вот перечитала всю имеющуюся в наличии увлекательную литературу по индексам (даже кажется поняла как это работает!) в связи с этим подправила их и where в запросах (и так было хорошо), но стало пошустрее раза в два-три (локально).

у меня к базе подключаются до 40 пользователей, тормозов никаких не наблюдается. Правда сетка гиговая на 2-ух свичах DGS-24.
в ходе работы в диспетчере задач (вкладка сеть) наблюдались мгновенные пики, порой до 40%. Конкретно работала по ним, по сетке пока не тестировала - Выходные!
(Кстати 1С грузит сетку до 30% и это не пики, а волна протяженностью по 3-7сек. Ужасно! Ладно хоть их мах. до 5-ти машин.)

Приблизительно такие же несколько crazy-запросов (как опубликованный выше, который собрали - "лишь бы работал") тоже попили кровушки, но вплотную занявшись ими добивались поразительных результатов. Удачи!
...
Рейтинг: 0 / 0
21 сообщений из 71, страница 3 из 3
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос к таблице в общем доступе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]