powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос к таблице в общем доступе
25 сообщений из 71, страница 2 из 3
Запрос к таблице в общем доступе
    #38108087
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получается, что если кто-то захочет выполнить SELECT, то все остальные пользователи должны отработать перед ним "USE ...".
И не только, согласно старттопику они должны выйти из приложения, если их трое и более.
Так как из-за них увеличивается время выборки в 20-25 раз, что могло бы означать и сброс буферов на диск, если бы не необходимость перезапуска приложения после них.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38108089
Fox_Old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Людмilaи я про то же!
грамотный Select и моргнуть не успеете.

Абсолютно согласен!
А если еще в таблице(ах) и правильные индексы созданы...
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38108104
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я как-то эксперименты проводил, смотрел как читаются файлы по сетке. Наблюдения оказались следующими:
1. Если один пользователь работает в файлами, то виндовс кэширует файл на клиенте, т.е. прога работает с локальным кэшем.
2. Если пользователей два и более, то при каждом обращении идет считывание по сетке всего что надо фоксу. Отсюда и тормоза, сетка гораздо медленнее чем кэш в памяти. Если пользователей много или сервер еще какие базы файл-серверные содержит, то тут запросто тормоза в 20-30 раз получить.
Поэтому для больших ФС баз (не важно на чем написанных) надо либо в терминал их селить чтоб к базе обращение локально происходило, либо переписывать в клиент-сервер. Хотя как вариант можно гигабитную сетку проложить, но в большинстве случаев это будет дороже и сложнее сделать. Как вариант хотя бы сервер по гигабитному каналу подцепить.

PS Запросы надо оптимизировать всегда. Но данную проблему это не решит, только сгладит немного.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38108106
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSQL-запрос к SQL-серверу и к DBFам это разные вещи.
Кто бы спорил.
Так и формируйте к MySQL-свой, к SQL Server - свой, к Oracle... , ну и к Фоксу естественно - свой SQL-запрос.
Боюсь спросить инициатора темы выложить свой метод запроса, а то судя по (... на сервере вроде Винда какая-то), как минимум -Чудненько.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38108132
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛюдмilaБоюсь спросить инициатора темы выложить свой метод запроса, а то судя по (... на сервере вроде Винда какая-то), как минимум -Чудненько.

А я бы все-таки попробывал бы увеличить кеширование, если это возможно.
И перенес бы эти таблицы и эту часть кода в небольшую тестовую программку, чтобы провести эксперименты, которые описал ДимаТ - сервер, каналы, ОС, приложение ...
Чтобы не гадать каждый раз туманное SOS, а найти причину принципиально.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38108312
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12А я бы все-таки попробывал бы увеличить кеширование, если это возможно.
Это вопрос к админам виндовса. Но думаю это невозможно. Если только кэшировать средствами самой проги с учетом логики работы приложения.

sg12И перенес бы эти таблицы и эту часть кода в небольшую тестовую программку, чтобы провести эксперименты, которые описал ДимаТ - сервер, каналы, ОС, приложение ...
Чтобы не гадать каждый раз туманное SOS, а найти причину принципиально.
Выкладывать таблицы очень нездоровый совет. Не надо выкладывать рабочие базы в открытый доступ. Всегда есть желающие ознакомится с чужой инфой, останавливает только стоимость. А тут пусть не все, но абсолютно бесплатно.
В данном случае конкретные данные роли не играют. Проблема есть и ее масштаб зависит только от размера данных. Поэтому достаточно сгенерить таблицу с 1-2 справочниками на одном компе и со второго пробовать делать какой-нибудь боле-мене стандартный запрос. Затем то же самое но открыв базу с третьего компа (или на первом если третьего нет).
Оценивать трафик проще всего открыв состояние сетевого соединения, там видно входящий/исходящий трафик. Правда у проводной сетевухи он в пакетах измеряется. Если по вайфаю - будет в байтах.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38108432
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЯ как-то эксперименты проводил, смотрел как читаются файлы по сетке. Наблюдения оказались следующими:
Ваши эксперименты тянут где-то на докторскую, но скорее всего вами заинтересуется отдел внутренней безопасности Microsoft. А именно - винда кэширует файл(ы) в оперативку, НО как она это делает - фиг его знает. Разбивает ли она невлазящие файлы на куски и чего она делает с этими кусками, где они хранятся - вопросы к Гейтсу. Да, собственно, неизвестно и то, как винда поступает с файлом даже в 100 байт, где, как и куда.
Dima T1. Если один пользователь работает в файлами, то виндовс кэширует файл на клиенте, т.е. прога работает с локальным кэшем.
Недоказуемо. Вы снимали траффик между клиентом-сервером и анализировали каждый переданный по сети байт ? :)
Dima T2. Если пользователей два и более, то при каждом обращении идет считывание по сетке всего что надо фоксу.
Это прописано и в хелпе VFP, но на уровне "для домохозяек". Причём, не обязательно "два и более", может быть в сети и один юзер.
Dima TОтсюда и тормоза, сетка гораздо медленнее чем кэш в памяти. Если пользователей много или сервер еще какие базы файл-серверные содержит, то тут запросто тормоза в 20-30 раз получить.
Сеть естессно гораздо медленнее кэша и это будет всё заметнее с подключением новых рабочих мест. Однако, после их обратного отключения от задачи, ситуация должна возвращаться у последнего (единственного) юзера к тем-же цифрам (время). Это я всё к тому, что автору надо капитально ревизовать клиентскую прогу. То-ли некорректные SQL-запросы (а чё упёрлись в SQL-запросы ?), то-ли баги в открытии/закрытии таблиц/баз.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38108441
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лично мне до ваших и чьих-либо баз и табличек фиолетово, но запрос то можно выложить, если не хотите читать книги и хотите чтобы вам помогли. Хотябы:
SELE * from Table1 WHERE условия отбора INTO CURS MyCurs
-по каким полям индексирована Table1
-условие отбора с порядковой точностью

Мудрёный запрос к 2-3 таблицам в среднем по 100Мб со всякими join и прочими происходит за 0,000* сек на средненьком компе (есть даже Pen3) и безразлично сколько человек юзают данные Таблицы (у меня до 40, в том числе КурсорАдаптеры с обновлением из этих же таблиц с интервалом в 20 сек)
Рулит грамотный SQL-запрос!!!
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38108475
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Людмila,

SELECT - это одно. А вот INSERT и DELETE будут все равно тормозить.
Рулит не селект - рулит правильное проектирование приложения...
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38108539
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM ... правильное проектирование приложения...

Всегда интересовал вопрос - что означает это выражение применительно конкретно к VFP.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38108667
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12, с труллялами - не общаемся
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38108726
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rewareDima TЯ как-то эксперименты проводил, смотрел как читаются файлы по сетке. Наблюдения оказались следующими:
Ваши эксперименты тянут где-то на докторскую, но скорее всего вами заинтересуется отдел внутренней безопасности Microsoft. А именно - винда кэширует файл(ы) в оперативку, НО как она это делает - фиг его знает.
Как это реализовано не важно. Сгенери табличку весом в гигабайт и проделай то что я написал. По времени выполнения запроса будет видно разницу.
rewareDima T1. Если один пользователь работает в файлами, то виндовс кэширует файл на клиенте, т.е. прога работает с локальным кэшем.
Недоказуемо. Вы снимали траффик между клиентом-сервером и анализировали каждый переданный по сети байт ? :)
Это легко реализуемо. Если ОС клиента закэшировала файл и просто периодически опрашивает сервер что файл больше никем другим не открыт. Такой опрос гораздо быстрее и меньше трафика потребляет чем каждый раз файл тянуть. Речь о кэше на чтение.
rewareОднако, после их обратного отключения от задачи, ситуация должна возвращаться у последнего (единственного) юзера к тем-же цифрам (время).
С этим согласен. Но конкретного ничего не скажу, не проверял такую ситуацию.
reware то-ли баги в открытии/закрытии таблиц/баз.
Вот это точно бред. Как можно неправильно открывать/закрывать таблицы в фоксе? Это происходит фоксе у всех одинаково, если б такая проблема была, то о ней было бы давно известно.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38108752
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
Запрос к таблице в общем доступе
    #38108779
DmDeD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Людмila,

Да запрос вроде простой.

Пример открыьтя таблиц:
USE pcBdSchedulesPath+"_put_list.dbf" SHARED IN 4001 ALIAS bd_schedules_apl_loc


Пример запроса (выполняется в цикле по периодам и внутри каждого периода по отделам)
SELECT;
bd_schedules_apl_loc.apl_id,;
bd_schedules_apl_loc.apl_stats,;
bd_schedules_apl_loc.apl_numb,;
bd_schedules_apl_loc.apl_name,;
bd_schedules_apl_loc.apl_datetm,;
bd_schedules_apl_loc.apl_datego,;
bd_schedules_apl_loc.rep_ocens,;
bd_schedules_apl_loc.kol_banks,;
(IIF(bd_schedules_apl_loc.kol_banks>0,bd_schedules_apl_loc.kol_banks,cur_sum_clnt.sum_clnt))sum_clnt,;
bd_schedules_otdels.otdel_code,;
bd_schedules_otdels.work_srok,;
bd_schedules_otdels.work_id,;
nsi_type_work.group_name,;
cur_lost_requery.max_daterq,;
({..})date_norm,;
(0)isp_stats,;
cur_lost_query.no_requer;
FROM ;
bd_schedules_apl_loc;
INNER JOIN bd_schedules_otdels;
ON bd_schedules_apl_loc.apl_id = bd_schedules_otdels.apl_id ;
INNER JOIN nsi_type_work ;
ON bd_schedules_otdels.work_id = nsi_type_work.id_work;
left OUTER JOIN cur_sum_clnt;
ON bd_schedules_apl_loc.apl_id = cur_sum_clnt.apl_id ;
left OUTER JOIN cur_lost_requery;
ON bd_schedules_apl_loc.apl_id = cur_lost_requery.apl_id ;
left OUTER JOIN cur_lost_query;
ON bd_schedules_apl_loc.apl_id = cur_lost_query.apl_id ;
WHERE bd_schedules_apl_loc.apl_stats = "закрыто";
AND bd_schedules_apl_loc.apl_datego BETWEEN pdDateRepStart AND pdDateRepFinish;
AND bd_schedules_otdels.otdel_stat = 1;
AND bd_schedules_otdels.otdel_base = "1";
AND bd_schedules_otdels.otdel_code = ALLTRIM(lcOtdelCode);
AND bd_schedules_apl_loc.wiev_code # "1";
INTO CURSOR cur_stat1 READWRITE


Комментарий:
bd_schedules_apl_loc - основная таблица со списком дел
bd_schedules_otdels - таблица со списком отдлов-исполнителей
nsi_type_work - таблица НСИ с видами работ
cur_lost_query, cur_lost_requery - курсоры с датами запросов и ответов по делам
cur_sum_clnt - курсос с кол-вом клиентских записей для каждого дела
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38108793
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmDeD, смотрел чего оптимизатор фоксовый пишет?
Код: sql
1.
2.
3.
4.
SYS(3054,12,'lcVar')
select ...
? lcVar
_cliptext = lcVar && Скопировать в буфер обмена


Покажи чего получилось.

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

Оптимизатор выдаёт следующее:
--------------------------------------------------------------------------------------
Rushmore optimization for table bd_schedules_apl_loc: none
Rushmore optimization for table bd_schedules_otdels: none
Rushmore optimization for table nsi_type_work: none
Rushmore optimization for intermediate result: none
Rushmore optimization for intermediate result: none
Rushmore optimization for intermediate result: none
Joining table nsi_type_work and table bd_schedules_otdels using temp index
Joining intermediate result and table bd_schedules_apl_loc using temp index
Joining intermediate result and intermediate result using temp index
Joining intermediate result and intermediate result using temp index
Joining intermediate result and intermediate result using temp index
--------------------------------------------------------------------------------------

Число записей в основной таблице - около 15 тыс.
В результирующем запросе - 5 - 9 (в зависимости от одела)

Запрос выполняется в 4х7 цикла, каждый примерно по 6-7 секунд (при запуске приложения несколькими пользователями)
В итоге и набегает около 3 минут.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109014
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmDeD, у тебя оптимизатор ни одного индекса не использует, т.е. все таблицы тянутся на клиента и делается скан таблицы.
Надо бы сделать индексы bd_schedules_apl_loc.apl_datego, bd_schedules_otdels.apl_id и nsi_type_work.id_work
Код: sql
1.
2.
3.
4.
5.
6.
sele bd_schedules_apl_loc
index on apl_datego tag apl_datego
sele bd_schedules_otdels
index on apl_id tag apl_id
sele nsi_type_work
index on id_work tag id_work


bd_schedules_otdels.apl_id и nsi_type_work.id_work - это ключевые поля таблиц как понимаю. Странно что на них индексов нет.
Ну индексы таблицам надо не перед запросом делать, а где-то заранее в специально предусмотренное для этого время.

ну и курсоры индексировать по apl_id после наполнения чтоб оптимизатору этим не заниматься
Код: sql
1.
2.
3.
4.
5.
6.
sele cur_lost_query
index on apl_id tag apl_id
sele cur_lost_requery
index on apl_id tag apl_id
sele cur_sum_clnt
index on apl_id tag apl_id


DmDeDЗапрос выполняется в 4х7 цикла
Что меняется во WHERE запроса при каждом проходе? Есть смысл один раз сделать предварительную выборку всех нужных данных из таблиц в курсор, проиндексировать его если надо, а затем использовать курсор внутри циклов. т.е. примерно так:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT ...;
FROM bd_schedules_apl_loc;
  INNER JOIN bd_schedules_otdels ON bd_schedules_apl_loc.apl_id = bd_schedules_otdels.apl_id ;
  INNER JOIN nsi_type_work ON bd_schedules_otdels.work_id = nsi_type_work.id_work;
  WHERE ????;
INTO CURSOR cur_preselect


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

Индексы я не ставил по двум причинам: 1. в индексированных таблицах замедляются операции ввода и редактирования данных, 2 - при добавлении новых записей необходима повторная переиндексация, что подразумевает отключение от базы всех пользователей.
В данном варианте исполнения приложения это не совсем удобно. В дальнейшем возможно база будет разделена на текущую (куда добавляются и редактируются новые записи) и архивную (закрытые дела, по которым редактирование осуществляется крайне редко). Быть может тогда стоит применить индексирование к архивной части базы, т.к. данный запрос формируется именно по закрытым делам.

Согласен, что процес запроса "цикл в цикле" не совсем удачное решение. К сожаленю, так построена структура формирования отчёта. С другой стороны, при одиночном использовании приложения этот запрос выполняется за 20-25 секунд (от момента запуска до открытия готового отчёта в excel). Это нормально по сравнению с 3-8 минутами (при коллективном использовании приложения).
Т.е. сам запрос отрабатывает относительно быстро (понятно, что при индексации будет ещё быстрее). Не понятна причина, по которой разница по времени возрастает раз в 20, когда подключается хотябы ещё 1 пользователь.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109066
DmDeD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

по WHERE меняется сначала период (1 квартал, 2, 4 или 4), а внутри код отдела, для которого формируется отчёт.

например,
выбрали 1-й квартал.
для периода с 01/01 по 31/03 в цикле для каждого отдела выгружаются данные и записываются на разные листы в excel в столбец А

Выбрали 2-й квартаол
для периода с 01/01 по 31/03 в цикле для каждого отдела выгружаются данные и записываются на разные листы в excel в столбец А
для периода с 01/04 по 30/06 в цикле для каждого отдела выгружаются данные и записываются на разные листы в excel в столбец B

и т.д.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109077
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmDeDИндексы я не ставил по двум причинам: 1. в индексированных таблицах замедляются операции ввода и редактирования данных, 2 - при добавлении новых записей необходима повторная переиндексация, что подразумевает отключение от базы всех пользователей.Откуда такая информация??
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109082
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmDeDИндексы я не ставил по двум причинам ...
причины ставить не рассматривались в принципе?
Тогда только предварительный селект из этой чудо-базы. Как я выше предложил.

DmDeDНе понятна причина, по которой разница по времени возрастает раз в 20, когда подключается хотя бы ещё 1 пользователь.
13764359 это прочитал? как раз про причину.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109101
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmDeDпо WHERE меняется сначала период (1 квартал, 2, 4 или 4), а внутри код отдела, для которого формируется отчёт.
Выбери сначала за год по всем отделам в курсор, проиндексируй курсор по дате и дальше 28 раз из курсора. Без индексов в базе так будет в 27-28 раз быстрее.

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

Да, читал. Просто на столько явное расхождение по времени и неужеди всё уходит на сеть...

Изначально индексирование не рассматривалось. Были несколько другие задачи и объёмы. + слышал не очень-то лестные отзывы о работе с индексированными таблицами: периодически индексы падали... А так, да. Но скорее для варианта с разделёнными базами.

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

В книгах по Фоксу читал, но сейчас уже не помню в каких именно.
...
Рейтинг: 0 / 0
Запрос к таблице в общем доступе
    #38109122
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmDeDВ книгах по Фоксу читал, но сейчас уже не помню в каких именно.Видимо, вы читали не те книги
Первое: если ввод/редактирование производится интерактивно, то замедление от использования индексов несравнимо с общим временем простоя системы.
Второе вообще неверно - про что и рассказал Dima T .
...
Рейтинг: 0 / 0
25 сообщений из 71, страница 2 из 3
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос к таблице в общем доступе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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