|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Получается, что если кто-то захочет выполнить SELECT, то все остальные пользователи должны отработать перед ним "USE ...". И не только, согласно старттопику они должны выйти из приложения, если их трое и более. Так как из-за них увеличивается время выборки в 20-25 раз, что могло бы означать и сброс буферов на диск, если бы не необходимость перезапуска приложения после них. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2013, 04:32 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Людмilaи я про то же! грамотный Select и моргнуть не успеете. Абсолютно согласен! А если еще в таблице(ах) и правильные индексы созданы... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2013, 04:55 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Я как-то эксперименты проводил, смотрел как читаются файлы по сетке. Наблюдения оказались следующими: 1. Если один пользователь работает в файлами, то виндовс кэширует файл на клиенте, т.е. прога работает с локальным кэшем. 2. Если пользователей два и более, то при каждом обращении идет считывание по сетке всего что надо фоксу. Отсюда и тормоза, сетка гораздо медленнее чем кэш в памяти. Если пользователей много или сервер еще какие базы файл-серверные содержит, то тут запросто тормоза в 20-30 раз получить. Поэтому для больших ФС баз (не важно на чем написанных) надо либо в терминал их селить чтоб к базе обращение локально происходило, либо переписывать в клиент-сервер. Хотя как вариант можно гигабитную сетку проложить, но в большинстве случаев это будет дороже и сложнее сделать. Как вариант хотя бы сервер по гигабитному каналу подцепить. PS Запросы надо оптимизировать всегда. Но данную проблему это не решит, только сгладит немного. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2013, 09:03 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Dima TSQL-запрос к SQL-серверу и к DBFам это разные вещи. Кто бы спорил. Так и формируйте к MySQL-свой, к SQL Server - свой, к Oracle... , ну и к Фоксу естественно - свой SQL-запрос. Боюсь спросить инициатора темы выложить свой метод запроса, а то судя по (... на сервере вроде Винда какая-то), как минимум -Чудненько. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2013, 09:13 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
ЛюдмilaБоюсь спросить инициатора темы выложить свой метод запроса, а то судя по (... на сервере вроде Винда какая-то), как минимум -Чудненько. А я бы все-таки попробывал бы увеличить кеширование, если это возможно. И перенес бы эти таблицы и эту часть кода в небольшую тестовую программку, чтобы провести эксперименты, которые описал ДимаТ - сервер, каналы, ОС, приложение ... Чтобы не гадать каждый раз туманное SOS, а найти причину принципиально. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2013, 11:01 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
sg12А я бы все-таки попробывал бы увеличить кеширование, если это возможно. Это вопрос к админам виндовса. Но думаю это невозможно. Если только кэшировать средствами самой проги с учетом логики работы приложения. sg12И перенес бы эти таблицы и эту часть кода в небольшую тестовую программку, чтобы провести эксперименты, которые описал ДимаТ - сервер, каналы, ОС, приложение ... Чтобы не гадать каждый раз туманное SOS, а найти причину принципиально. Выкладывать таблицы очень нездоровый совет. Не надо выкладывать рабочие базы в открытый доступ. Всегда есть желающие ознакомится с чужой инфой, останавливает только стоимость. А тут пусть не все, но абсолютно бесплатно. В данном случае конкретные данные роли не играют. Проблема есть и ее масштаб зависит только от размера данных. Поэтому достаточно сгенерить таблицу с 1-2 справочниками на одном компе и со второго пробовать делать какой-нибудь боле-мене стандартный запрос. Затем то же самое но открыв базу с третьего компа (или на первом если третьего нет). Оценивать трафик проще всего открыв состояние сетевого соединения, там видно входящий/исходящий трафик. Правда у проводной сетевухи он в пакетах измеряется. Если по вайфаю - будет в байтах. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2013, 15:59 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Dima TЯ как-то эксперименты проводил, смотрел как читаются файлы по сетке. Наблюдения оказались следующими: Ваши эксперименты тянут где-то на докторскую, но скорее всего вами заинтересуется отдел внутренней безопасности Microsoft. А именно - винда кэширует файл(ы) в оперативку, НО как она это делает - фиг его знает. Разбивает ли она невлазящие файлы на куски и чего она делает с этими кусками, где они хранятся - вопросы к Гейтсу. Да, собственно, неизвестно и то, как винда поступает с файлом даже в 100 байт, где, как и куда. Dima T1. Если один пользователь работает в файлами, то виндовс кэширует файл на клиенте, т.е. прога работает с локальным кэшем. Недоказуемо. Вы снимали траффик между клиентом-сервером и анализировали каждый переданный по сети байт ? :) Dima T2. Если пользователей два и более, то при каждом обращении идет считывание по сетке всего что надо фоксу. Это прописано и в хелпе VFP, но на уровне "для домохозяек". Причём, не обязательно "два и более", может быть в сети и один юзер. Dima TОтсюда и тормоза, сетка гораздо медленнее чем кэш в памяти. Если пользователей много или сервер еще какие базы файл-серверные содержит, то тут запросто тормоза в 20-30 раз получить. Сеть естессно гораздо медленнее кэша и это будет всё заметнее с подключением новых рабочих мест. Однако, после их обратного отключения от задачи, ситуация должна возвращаться у последнего (единственного) юзера к тем-же цифрам (время). Это я всё к тому, что автору надо капитально ревизовать клиентскую прогу. То-ли некорректные SQL-запросы (а чё упёрлись в SQL-запросы ?), то-ли баги в открытии/закрытии таблиц/баз. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2013, 19:20 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Лично мне до ваших и чьих-либо баз и табличек фиолетово, но запрос то можно выложить, если не хотите читать книги и хотите чтобы вам помогли. Хотябы: SELE * from Table1 WHERE условия отбора INTO CURS MyCurs -по каким полям индексирована Table1 -условие отбора с порядковой точностью Мудрёный запрос к 2-3 таблицам в среднем по 100Мб со всякими join и прочими происходит за 0,000* сек на средненьком компе (есть даже Pen3) и безразлично сколько человек юзают данные Таблицы (у меня до 40, в том числе КурсорАдаптеры с обновлением из этих же таблиц с интервалом в 20 сек) Рулит грамотный SQL-запрос!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2013, 19:45 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Людмila, SELECT - это одно. А вот INSERT и DELETE будут все равно тормозить. Рулит не селект - рулит правильное проектирование приложения... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2013, 20:56 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
AndreTM ... правильное проектирование приложения... Всегда интересовал вопрос - что означает это выражение применительно конкретно к VFP. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.01.2013, 22:14 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
sg12, с труллялами - не общаемся ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 01:38 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
rewareDima TЯ как-то эксперименты проводил, смотрел как читаются файлы по сетке. Наблюдения оказались следующими: Ваши эксперименты тянут где-то на докторскую, но скорее всего вами заинтересуется отдел внутренней безопасности Microsoft. А именно - винда кэширует файл(ы) в оперативку, НО как она это делает - фиг его знает. Как это реализовано не важно. Сгенери табличку весом в гигабайт и проделай то что я написал. По времени выполнения запроса будет видно разницу. rewareDima T1. Если один пользователь работает в файлами, то виндовс кэширует файл на клиенте, т.е. прога работает с локальным кэшем. Недоказуемо. Вы снимали траффик между клиентом-сервером и анализировали каждый переданный по сети байт ? :) Это легко реализуемо. Если ОС клиента закэшировала файл и просто периодически опрашивает сервер что файл больше никем другим не открыт. Такой опрос гораздо быстрее и меньше трафика потребляет чем каждый раз файл тянуть. Речь о кэше на чтение. rewareОднако, после их обратного отключения от задачи, ситуация должна возвращаться у последнего (единственного) юзера к тем-же цифрам (время). С этим согласен. Но конкретного ничего не скажу, не проверял такую ситуацию. reware то-ли баги в открытии/закрытии таблиц/баз. Вот это точно бред. Как можно неправильно открывать/закрывать таблицы в фоксе? Это происходит фоксе у всех одинаково, если б такая проблема была, то о ней было бы давно известно. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 06:53 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Провел тест. Исходные данные: Таблица со строками накладных размер 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, 08:20 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Людм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 - курсос с кол-вом клиентских записей для каждого дела ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 09:19 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
DmDeD, смотрел чего оптимизатор фоксовый пишет? Код: sql 1. 2. 3. 4.
Покажи чего получилось. Еще вопрос: Количество записей bd_schedules_apl_loc и количество записей в результате запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 09:47 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
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 минут. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 10:55 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
DmDeD, у тебя оптимизатор ни одного индекса не использует, т.е. все таблицы тянутся на клиента и делается скан таблицы. Надо бы сделать индексы bd_schedules_apl_loc.apl_datego, bd_schedules_otdels.apl_id и nsi_type_work.id_work Код: sql 1. 2. 3. 4. 5. 6.
bd_schedules_otdels.apl_id и nsi_type_work.id_work - это ключевые поля таблиц как понимаю. Странно что на них индексов нет. Ну индексы таблицам надо не перед запросом делать, а где-то заранее в специально предусмотренное для этого время. ну и курсоры индексировать по apl_id после наполнения чтоб оптимизатору этим не заниматься Код: sql 1. 2. 3. 4. 5. 6.
DmDeDЗапрос выполняется в 4х7 цикла Что меняется во WHERE запроса при каждом проходе? Есть смысл один раз сделать предварительную выборку всех нужных данных из таблиц в курсор, проиндексировать его если надо, а затем использовать курсор внутри циклов. т.е. примерно так: Код: sql 1. 2. 3. 4. 5. 6.
Тогда тормоз будет один, а не 28. Пусть он будет чуть дольше выбираться, но не в 28 раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 12:29 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Dima T, Индексы я не ставил по двум причинам: 1. в индексированных таблицах замедляются операции ввода и редактирования данных, 2 - при добавлении новых записей необходима повторная переиндексация, что подразумевает отключение от базы всех пользователей. В данном варианте исполнения приложения это не совсем удобно. В дальнейшем возможно база будет разделена на текущую (куда добавляются и редактируются новые записи) и архивную (закрытые дела, по которым редактирование осуществляется крайне редко). Быть может тогда стоит применить индексирование к архивной части базы, т.к. данный запрос формируется именно по закрытым делам. Согласен, что процес запроса "цикл в цикле" не совсем удачное решение. К сожаленю, так построена структура формирования отчёта. С другой стороны, при одиночном использовании приложения этот запрос выполняется за 20-25 секунд (от момента запуска до открытия готового отчёта в excel). Это нормально по сравнению с 3-8 минутами (при коллективном использовании приложения). Т.е. сам запрос отрабатывает относительно быстро (понятно, что при индексации будет ещё быстрее). Не понятна причина, по которой разница по времени возрастает раз в 20, когда подключается хотябы ещё 1 пользователь. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 12:46 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
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 и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 12:52 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
DmDeDИндексы я не ставил по двум причинам: 1. в индексированных таблицах замедляются операции ввода и редактирования данных, 2 - при добавлении новых записей необходима повторная переиндексация, что подразумевает отключение от базы всех пользователей.Откуда такая информация?? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 12:57 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
DmDeDИндексы я не ставил по двум причинам ... причины ставить не рассматривались в принципе? Тогда только предварительный селект из этой чудо-базы. Как я выше предложил. DmDeDНе понятна причина, по которой разница по времени возрастает раз в 20, когда подключается хотя бы ещё 1 пользователь. 13764359 это прочитал? как раз про причину. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 13:00 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
DmDeDпо WHERE меняется сначала период (1 квартал, 2, 4 или 4), а внутри код отдела, для которого формируется отчёт. Выбери сначала за год по всем отделам в курсор, проиндексируй курсор по дате и дальше 28 раз из курсора. Без индексов в базе так будет в 27-28 раз быстрее. PS Пересмотри свое отношение к индексам. При изменении/добавлении замедление незначительное и после они автоматом перестраиваются. Индексация нужна только если прога вылетела в процессе изменения базы, т.е. данные успели сохраниться в таблицу, а индекс не успел перестроится. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 13:10 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
Dima T, Да, читал. Просто на столько явное расхождение по времени и неужеди всё уходит на сеть... Изначально индексирование не рассматривалось. Были несколько другие задачи и объёмы. + слышал не очень-то лестные отзывы о работе с индексированными таблицами: периодически индексы падали... А так, да. Но скорее для варианта с разделёнными базами. В любом случае, Dima T, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 13:11 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
AndreTM, В книгах по Фоксу читал, но сейчас уже не помню в каких именно. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 13:13 |
|
Запрос к таблице в общем доступе
|
|||
---|---|---|---|
#18+
DmDeDВ книгах по Фоксу читал, но сейчас уже не помню в каких именно.Видимо, вы читали не те книги Первое: если ввод/редактирование производится интерактивно, то замедление от использования индексов несравнимо с общим временем простоя системы. Второе вообще неверно - про что и рассказал Dima T . ... |
|||
:
Нравится:
Не нравится:
|
|||
14.01.2013, 13:24 |
|
|
start [/forum/topic.php?fid=41&msg=38108441&tid=1583216]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 310ms |
total: | 466ms |
0 / 0 |