powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
16 сообщений из 16, страница 1 из 1
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
    #38070811
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, я в растерянности.
Есть таблица, простая, с полями Город (Town), Улица (Ul), Дом (Dom), Квартира (Kv). Все поля текстовые.
Есть форма с гридом, куда все это выводится.
В таблице порядка 50 тыс записей.
В этой же форме для поиска есть 2 Combobox с уникальными значениями городов и улиц и 2 TextBox для ввода дома и квартиры.
При заполнении критериев для поиска выполняю простой фильтр, в зависимости от заполненных значений.
То есть. Либо только по городу, либо только по дому, либо по городу и по дому, короче различные комбинации.
set filter to allt(dom)=allt(thisform.dom.value) and allt(kv)=allt(thisform.kv.value)
set filter to ul=thisform.ul.value and allt(dom)=allt(thisform.dom.value) and allt(kv)=allt(thisform.kv.value)


Локально или по сети, если монопольно (или 1 пользователь) все летает прекрасно.
Как только несколько пользователей - то жутко тормозит по сети.
Дело даже не в том, что фильтрует долго, после фильтра даже привисает при переходе на другие записи.

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

Как мне оптимизировать фильтр?
Думаю сделать составной индекс по полям, но не придумаю как потом по нему искать.
...
Рейтинг: 0 / 0
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
    #38070824
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А. С.,

Делай вместо фильтров выборки в курсоры и на локальной машине работай с этими курсорами.
...
Рейтинг: 0 / 0
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
    #38070912
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как вариант да. Но мне в процессе работы надо там видеть изменения, которые другие пользователи вносят.
...
Рейтинг: 0 / 0
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
    #38071128
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А. С.Как вариант да. Но мне в процессе работы надо там видеть изменения, которые другие пользователи вносят.
И что может постоянно меняться? Город, Улица, Дом, Квартира?

Используй курсорадаптер. Для обновления у него есть метод RecordRefresh()
...
Рейтинг: 0 / 0
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
    #38071429
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это я для примера написал, там в реале полей больше. Добавляются новые к тому же.
...
Рейтинг: 0 / 0
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
    #38071479
Pulsar_p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А. С.,
У меня самого подобная задача, только записей в основной таблице в несколько раз больше (если брать суммарно по таблицам>1 000000 записей), полей за сотню, а пользователей, одновременно работающих с базой, не один десяток. Использовать "set filter to" в такой ситуации очень, очень плохая идея, потому как получаются жуткие тормоза. Я в своем большом приложении не использую эту установку ни разу: и дело не только в том, что тормозит (на маленьких объемах информации может и нет), а в том, что где-нибудь забудешь снять этот фильтр, потом намучаешься, и не все операторы берут во внимание эту установку... Плавали, знаем. Jonny540 прав, "Делай вместо фильтров выборки в курсоры и на локальной машине работай с этими курсорами." Я так и поступаю, мне кажется, это самый оптимальный путь. Во-всяком случае, 1 или 20 пользователей одновременно работают с базой, по скорости обработки данных существенной разницы нет. Понятно, что переделывать приложение довольно трудная задача, но если хочешь избавиться от "тормозов" и других проблем, ИМХО, другого пути нет.
...
Рейтинг: 0 / 0
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
    #38071695
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А. С.Коллеги, я в растерянности.
Есть таблица, простая, с полями Город (Town), Улица (Ul), Дом (Dom), Квартира (Kv). Все поля текстовые.
<skipped>

Локально или по сети, если монопольно (или 1 пользователь) все летает прекрасно.
Как только несколько пользователей - то жутко тормозит по сети.

<skipped>

Как мне оптимизировать фильтр?
Думаю сделать составной индекс по полям, но не придумаю как потом по нему искать.
Да не надо индексов. Надо использовать SELECT-SQL. Если обьяснять на пальцах (правда их всего 10), то SET FILTER тупо сканирует сверху вниз всю таблицу и, будучи на будущее оставленным включенным, так и будет это делать при каждом поползновении юзера. Хорошо для маленьких таблиц. Я бы советовал (записей 50000, если я не забыл) использовать
Код: sql
1.
SELECT town, street, house, flat, recno() AS recn FROM MyTable INTO TABLE NewTable


В результате получаешь таблицу NewTable c полями town, street, house, flat и recn. В поле recn хранится номер recno() родимой единоутробной таблицы, откуда сделан селект. Все поля (кроме recn) можешь редактировать. И, кстати, не понятно было - изменения, внесённые в выборку должны попасть и в материнскую таблицу ? Допустим, да.
Тогда так - без всяких индексаций берём из NewTable значение recn и по нему делаем GO NewTable->recn IN MyTable. И все дела, мы стоим на нужной записи в MyTable, можно в ней править поля значениями из NewTable.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT NewTable
GO TOP
DO WHILE !EOF()
     SELECT MyTable
     GO NewTable->recn
     REPLACE town WITH NewTable->town, street WITH  NewTable->street,  ;
                  house   WITH   NewTable->house, flat WITH NewTable->flat
     SELECT NewTable
     SKIP
ENDDO



После всех изощрений сильно рекомендуется удалить временную таблицу NewTable (закрыв её, если открыта)
Код: sql
1.
ERASE NewTable.dbf
...
Рейтинг: 0 / 0
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
    #38073365
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, так и сделал, спасибо.
Встречный вопрос, просто ради любопытства.
Если я простые индексы сделаю на все эти поля, это ускорит выборку Select-SQL?
...
Рейтинг: 0 / 0
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
    #38073376
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Индексы в данном случае не нужны.
Указанный SELECT их не использует (нет никаких условий в выборке), а GO индекс не требуется - в Фоксе это простой арифметический расчет физического положения записи.
...
Рейтинг: 0 / 0
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
    #38074063
Penner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Index + Set Key
...
Рейтинг: 0 / 0
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
    #38076626
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
set key - не то...
есть задача искать в большой базе по части слова, не зная ни его положения ни количества.
Но тут уже перебором только. Либо как то переделывать, оптимизировать.
...
Рейтинг: 0 / 0
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
    #38076695
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А. С.есть задача искать в большой базе по части слова, не зная ни его положения ни количестваСоздайте отдельный топик с такой задачей - и посмотрим, какой из методов поиска по шаблону подойдёт...
...
Рейтинг: 0 / 0
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
    #38076947
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А. С.есть задача искать в большой базе по части слова, не зная ни его положения ни количества.
Но тут уже перебором только. Либо как то переделывать, оптимизировать.Насколько я понимаю "часть слова" - это подстрока, а не что-то прерывистое? Тогда вполне сойдет
Код: plsql
1.
select ..... where '...' $ <поле> ..... 

На таблице в 105000 записей - 2.38 сек., правда, на локальной машине.
То же самое с помощью scan ... endscan - 2.67 сек. Отобрано 24600 записей.
...
Рейтинг: 0 / 0
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
    #38077055
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jonny540,

Возникнет вопрос, что делать с этими 24600 записями. Неужели пользователь их в гриде будет просматривать. Через 5 минут глаза в кучку и в итоге он ничего нужного не найдет :)
...
Рейтинг: 0 / 0
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
    #38077126
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorNGJonny540,

Возникнет вопрос, что делать с этими 24600 записями. Неужели пользователь их в гриде будет просматривать. Через 5 минут глаза в кучку и в итоге он ничего нужного не найдет :)Так я ведь просто для примера... У ТС, может, всего 1-2 записи будут. А что делать - это другая тема.
...
Рейтинг: 0 / 0
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
    #38081248
А. С.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Зачем другая тема? Это все одна задача. Выборку делаю в локальный курсор, запоминаю последнее значение поиска в переменную. Все это в форме грида. Если юзер делает новый поиск, сужает выборку из 26000 записей, то анализирую какие критерии поиска поменялись. Если те значения что я запомнил (по тем что ранее уже выбрали) не поменялись, а добавились новые, то выбираю уже из этого локального курсора, но тут можно уже и фильтром. Но все равно долго выбирает первый. Если п означению поля целиком - то не долго. Если по частям вхождений текста - то длительно.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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