|
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
|
|||
---|---|---|---|
#18+
Коллеги, я в растерянности. Есть таблица, простая, с полями Город (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 пользователь) все летает прекрасно. Как только несколько пользователей - то жутко тормозит по сети. Дело даже не в том, что фильтрует долго, после фильтра даже привисает при переходе на другие записи. Отслеживаю мониторами разными, показывает трафик достаточно большой при фильтровании и смене записей. То есть каждый клик по строкам сопровождается качанием с сервера части таблицы. Как мне оптимизировать фильтр? Думаю сделать составной индекс по полям, но не придумаю как потом по нему искать. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2012, 11:17 |
|
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
|
|||
---|---|---|---|
#18+
А. С., Делай вместо фильтров выборки в курсоры и на локальной машине работай с этими курсорами. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2012, 11:39 |
|
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
|
|||
---|---|---|---|
#18+
Как вариант да. Но мне в процессе работы надо там видеть изменения, которые другие пользователи вносят. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2012, 13:42 |
|
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
|
|||
---|---|---|---|
#18+
А. С.Как вариант да. Но мне в процессе работы надо там видеть изменения, которые другие пользователи вносят. И что может постоянно меняться? Город, Улица, Дом, Квартира? Используй курсорадаптер. Для обновления у него есть метод RecordRefresh() ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2012, 20:36 |
|
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
|
|||
---|---|---|---|
#18+
Это я для примера написал, там в реале полей больше. Добавляются новые к тому же. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2012, 12:29 |
|
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
|
|||
---|---|---|---|
#18+
А. С., У меня самого подобная задача, только записей в основной таблице в несколько раз больше (если брать суммарно по таблицам>1 000000 записей), полей за сотню, а пользователей, одновременно работающих с базой, не один десяток. Использовать "set filter to" в такой ситуации очень, очень плохая идея, потому как получаются жуткие тормоза. Я в своем большом приложении не использую эту установку ни разу: и дело не только в том, что тормозит (на маленьких объемах информации может и нет), а в том, что где-нибудь забудешь снять этот фильтр, потом намучаешься, и не все операторы берут во внимание эту установку... Плавали, знаем. Jonny540 прав, "Делай вместо фильтров выборки в курсоры и на локальной машине работай с этими курсорами." Я так и поступаю, мне кажется, это самый оптимальный путь. Во-всяком случае, 1 или 20 пользователей одновременно работают с базой, по скорости обработки данных существенной разницы нет. Понятно, что переделывать приложение довольно трудная задача, но если хочешь избавиться от "тормозов" и других проблем, ИМХО, другого пути нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2012, 13:40 |
|
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
|
|||
---|---|---|---|
#18+
А. С.Коллеги, я в растерянности. Есть таблица, простая, с полями Город (Town), Улица (Ul), Дом (Dom), Квартира (Kv). Все поля текстовые. <skipped> Локально или по сети, если монопольно (или 1 пользователь) все летает прекрасно. Как только несколько пользователей - то жутко тормозит по сети. <skipped> Как мне оптимизировать фильтр? Думаю сделать составной индекс по полям, но не придумаю как потом по нему искать. Да не надо индексов. Надо использовать SELECT-SQL. Если обьяснять на пальцах (правда их всего 10), то SET FILTER тупо сканирует сверху вниз всю таблицу и, будучи на будущее оставленным включенным, так и будет это делать при каждом поползновении юзера. Хорошо для маленьких таблиц. Я бы советовал (записей 50000, если я не забыл) использовать Код: sql 1.
В результате получаешь таблицу 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.
После всех изощрений сильно рекомендуется удалить временную таблицу NewTable (закрыв её, если открыта) Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.12.2012, 21:03 |
|
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
|
|||
---|---|---|---|
#18+
Да, так и сделал, спасибо. Встречный вопрос, просто ради любопытства. Если я простые индексы сделаю на все эти поля, это ускорит выборку Select-SQL? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2012, 23:45 |
|
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
|
|||
---|---|---|---|
#18+
Индексы в данном случае не нужны. Указанный SELECT их не использует (нет никаких условий в выборке), а GO индекс не требуется - в Фоксе это простой арифметический расчет физического положения записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2012, 23:57 |
|
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
|
|||
---|---|---|---|
#18+
Index + Set Key ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2012, 13:33 |
|
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
|
|||
---|---|---|---|
#18+
set key - не то... есть задача искать в большой базе по части слова, не зная ни его положения ни количества. Но тут уже перебором только. Либо как то переделывать, оптимизировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2012, 21:23 |
|
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
|
|||
---|---|---|---|
#18+
А. С.есть задача искать в большой базе по части слова, не зная ни его положения ни количестваСоздайте отдельный топик с такой задачей - и посмотрим, какой из методов поиска по шаблону подойдёт... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2012, 22:15 |
|
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
|
|||
---|---|---|---|
#18+
А. С.есть задача искать в большой базе по части слова, не зная ни его положения ни количества. Но тут уже перебором только. Либо как то переделывать, оптимизировать.Насколько я понимаю "часть слова" - это подстрока, а не что-то прерывистое? Тогда вполне сойдет Код: plsql 1.
На таблице в 105000 записей - 2.38 сек., правда, на локальной машине. То же самое с помощью scan ... endscan - 2.67 сек. Отобрано 24600 записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 06:01 |
|
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
|
|||
---|---|---|---|
#18+
Jonny540, Возникнет вопрос, что делать с этими 24600 записями. Неужели пользователь их в гриде будет просматривать. Через 5 минут глаза в кучку и в итоге он ничего нужного не найдет :) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 09:42 |
|
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
|
|||
---|---|---|---|
#18+
IgorNGJonny540, Возникнет вопрос, что делать с этими 24600 записями. Неужели пользователь их в гриде будет просматривать. Через 5 минут глаза в кучку и в итоге он ничего нужного не найдет :)Так я ведь просто для примера... У ТС, может, всего 1-2 записи будут. А что делать - это другая тема. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2012, 10:36 |
|
Фильтр таблицы в гриде по нескольким полям, по сети жутко тормозит.
|
|||
---|---|---|---|
#18+
Зачем другая тема? Это все одна задача. Выборку делаю в локальный курсор, запоминаю последнее значение поиска в переменную. Все это в форме грида. Если юзер делает новый поиск, сужает выборку из 26000 записей, то анализирую какие критерии поиска поменялись. Если те значения что я запомнил (по тем что ранее уже выбрали) не поменялись, а добавились новые, то выбираю уже из этого локального курсора, но тут можно уже и фильтром. Но все равно долго выбирает первый. Если п означению поля целиком - то не долго. Если по частям вхождений текста - то длительно. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2012, 22:38 |
|
|
start [/forum/topic.php?fid=41&msg=38074063&tid=1583270]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
123ms |
get topic data: |
8ms |
get forum data: |
1ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 226ms |
0 / 0 |