Здравствуйте.
c55, ШВС
Броуз по файлу, условный выриант, ключ из трех полей (все поля long).
1. Задаю ограничение на первый элемент ключа по указанному значению равному 1 (причем в таблице записи в основном со значением 0 в этом поле) - работает все замечательно.
2. Прописываю фильтр Поле 2 = Переменная. В результате этого имею жуткие тормоза.
--
Эмберге! Арсений mailto:arseniy-at-home@yandex.ru
фильтры
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Это вполне естественно, так как для того, чтобы сработал фильтр, нужно проверить каждую дату.
Можно фильтр сделать не так. Есть такая рутинка BRW1::Validaterecord, условие фильтра можно задать в ней:
Если фильтр очень сложный, можно поставить после него Yield, чтобы дать операционке знать, что твоя прога дышит, а не тормозит, фильтруя записи.
На мой взгляд, это срабатывает быстрее.
--
Best regards,
Anatoly mailto:warthog@belarusbank.minsk.by
Можно фильтр сделать не так. Есть такая рутинка BRW1::Validaterecord, условие фильтра можно задать в ней:
Код: Выделить всё
if <field_2> not = <variable_2> then exit.
На мой взгляд, это срабатывает быстрее.
--
Best regards,
Anatoly mailto:warthog@belarusbank.minsk.by
Не понятно - фильтр по полю 2 работает с фильтром по полю 1 или первый пункт никак не связан со вторым, т.е. работает только фильтр по полю 2?
Если есть фильтр только по полю 2, то - все закономерно!
Ключ - это дерево, каждый из уровней которого - ключевое поле.
Быстро можно просмотреть ТОЛЬКО целиком весь первый уровень (т.е. фильтр только по первому полю) или очередной уровень какой-либо ОДНОЙ ветви.
- Если установлен фильтр по Полю1, то быстро можно пробежаться по верхним веткам 01-09-10.
- Если установлено ФИКСИРОВАННОЕ значение Поля1 и есть доп. фильтр по Полю2, то опять-же, можно быстро просмотреть все записи второго уровня ветки 01: 02-03-07
- Если установлено ФИКСИРОВАННОЕ значение для Поля1 и Поля2 и есть доп. фильтр по Полю3, то опять-же, получаем быструю выборку: 04-05-06
Из схемы видно, что если есть фильтр ТОЛЬКО по Полю2, то для выборки необходимо "проваливаться" в КАЖДУЮ ветку первого уровня и в КАЖДОЙ производить выборку по Полю2.
Т.е., при РУЧНОМ обходе с оптимизированным алгоритмом надо пройтись как минимум по 01-09-10 и, дополнительно, по некоторым записям второго уровня ветки 01 и захватить запись 11.
Я НЕ УВЕРЕН, что VIEW использует такой оптимизированный алгоритм.
А с обычным алгоритмом прийдется обойти ВСЕ записи таблицы, включая и ненужные, по условиям фильтра, записи третьего уровня!
Если-же фильтр у тебя задан и для поля1 и для поля2 одновременно и, как ты написал, задано ФИКСИРОВАННОЕ значение поля1, то надо смотреть на сам фильтр - возможно используются обороты, которые труднопонимаемы для парсера VIEW и не могут быть преобразованы в быстрый проход. Опять-же - какой тип у Поля2?
Для строковых полей, к примеру, очень часто помогает задание в фильтре UPPER(Поле2). Естественно, только для регистронечувствительной выборки. Хотя, честно говоря, еще ни разу не приходилось это использовать - нормально работает и так.
Вообщем, распиши свой вопрос более подробно.
Удачи!
=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru
Написал: ClaList(2)
Если есть фильтр только по полю 2, то - все закономерно!
Ключ - это дерево, каждый из уровней которого - ключевое поле.
Быстро можно просмотреть ТОЛЬКО целиком весь первый уровень (т.е. фильтр только по первому полю) или очередной уровень какой-либо ОДНОЙ ветви.
Код: Выделить всё
01: 1Поле
02: 2Поле
03: 2Поле
04: 3Поле
05: 3Поле
06: 3Поле
07: 2Поле
08: 3Поле
09: 1Поле
10: 1Поле
11: 2Поле
- Если установлено ФИКСИРОВАННОЕ значение Поля1 и есть доп. фильтр по Полю2, то опять-же, можно быстро просмотреть все записи второго уровня ветки 01: 02-03-07
- Если установлено ФИКСИРОВАННОЕ значение для Поля1 и Поля2 и есть доп. фильтр по Полю3, то опять-же, получаем быструю выборку: 04-05-06
Из схемы видно, что если есть фильтр ТОЛЬКО по Полю2, то для выборки необходимо "проваливаться" в КАЖДУЮ ветку первого уровня и в КАЖДОЙ производить выборку по Полю2.
Т.е., при РУЧНОМ обходе с оптимизированным алгоритмом надо пройтись как минимум по 01-09-10 и, дополнительно, по некоторым записям второго уровня ветки 01 и захватить запись 11.
Я НЕ УВЕРЕН, что VIEW использует такой оптимизированный алгоритм.
А с обычным алгоритмом прийдется обойти ВСЕ записи таблицы, включая и ненужные, по условиям фильтра, записи третьего уровня!
Если-же фильтр у тебя задан и для поля1 и для поля2 одновременно и, как ты написал, задано ФИКСИРОВАННОЕ значение поля1, то надо смотреть на сам фильтр - возможно используются обороты, которые труднопонимаемы для парсера VIEW и не могут быть преобразованы в быстрый проход. Опять-же - какой тип у Поля2?
Для строковых полей, к примеру, очень часто помогает задание в фильтре UPPER(Поле2). Естественно, только для регистронечувствительной выборки. Хотя, честно говоря, еще ни разу не приходилось это использовать - нормально работает и так.
Вообщем, распиши свой вопрос более подробно.
Удачи!
=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru
Написал: ClaList(2)
Спасибо за столь развернутый ответ. Проблема была не в фильтрах, проблема была в порядке условных вариантов - как всегда подводит собственная невнимательность.
Но есть еще один вопросик: вот для такого файла
что будет работать быстрее
или если файл сунуть во view и {prop:filter} = '(f1 = value1) and (f2 = value2)'
?
Вопрос возникает потому что browse все равно работает не очень быстро, особенно по сети. Кстати, если более подробно, то в условном варианте вот что написано:
Используемый ключ: my_key
Фильтр переменная: f2 = value2
Ограничение на: f1
Тип ограничения: заданное значение
Требуемое значение: переменная long
Может быть здесь собака порылась?
--
Эмберге! Арсений mailto:arseniy-at-home@yandex.ru
Написал: ClaList(2)
Но есть еще один вопросик: вот для такого файла
Код: Выделить всё
my_file file
my_key key(f1,f2)
record record
f1 long
f2 long
end
end
что будет работать быстрее
Код: Выделить всё
f1 = value1
f2 = value2
set(my_key,my_key)
loop
next(my_file)
if errorcode() or (f1<>value1) or (f2<>value2) then break .
.....
end
?
Вопрос возникает потому что browse все равно работает не очень быстро, особенно по сети. Кстати, если более подробно, то в условном варианте вот что написано:
Используемый ключ: my_key
Фильтр переменная: f2 = value2
Ограничение на: f1
Тип ограничения: заданное значение
Требуемое значение: переменная long
Может быть здесь собака порылась?
--
Эмберге! Арсений mailto:arseniy-at-home@yandex.ru
Написал: ClaList(2)
Вообще-то, быстрее работать будет первый вариант:
SET на первую запись последовательности - минимум времени.
А дальше идет обычное чтение по ключу всех записей подряд до вылета из цикла. Другое дело, что для бровза приведенная выборка - "плевое дело" и лишние милисекунды, затраченные VIEW, просто будут не заметны.
Где именно замедление:
- на этапе открытия бровза
- при заполнении первой/очередной страницы
- при обычной построчной прокрутке бровза
И, кстати, или я не обратил внимание, или ты забыл указать версию и вид шаблонов.
Дело в том, что в ABC (и, вероятно, в последней версии офоициальных Legacy-шаблонов от SV) есть две идеологии работы с бровзом - страничная и полная загрузка.
При второй во внутреннюю очередь бровза при его открытии загружаются ВСЕ записи, удовлетворяющие фильтру.
Естественно, что при большом кол-ве записей в выборке это может значительно замедлить первоначальное открытие бровза.
При твоих условиях самой идеальной является страничная идеология - VIEW быстро находит первую запись нужной последовательности и быстро заполняет первую страницу.
Да и дальнейшая работа должна идти без видимых тормозов.
Если-же ты итак используешь страничную загрузку бровза и тормоза наблюдаются при листании страниц или прокрутке записей, то, скорее всего - или слабенькая сеть или она загружена до предела.
Потому, что приведенный тобой фильтр - простейший вариант выборки и VIEW с ним должен справлятся вообще без проблем.
=============================
С уважением, Олег А. Руденко
Написал: ClaList(2)
SET на первую запись последовательности - минимум времени.
А дальше идет обычное чтение по ключу всех записей подряд до вылета из цикла. Другое дело, что для бровза приведенная выборка - "плевое дело" и лишние милисекунды, затраченные VIEW, просто будут не заметны.
А что значит - "все равно работает не очень быстро"?Вопрос возникает потому что browse все равно работает не очень быстро, особенно по сети.
Где именно замедление:
- на этапе открытия бровза
- при заполнении первой/очередной страницы
- при обычной построчной прокрутке бровза
И, кстати, или я не обратил внимание, или ты забыл указать версию и вид шаблонов.
Дело в том, что в ABC (и, вероятно, в последней версии офоициальных Legacy-шаблонов от SV) есть две идеологии работы с бровзом - страничная и полная загрузка.
При второй во внутреннюю очередь бровза при его открытии загружаются ВСЕ записи, удовлетворяющие фильтру.
Естественно, что при большом кол-ве записей в выборке это может значительно замедлить первоначальное открытие бровза.
При твоих условиях самой идеальной является страничная идеология - VIEW быстро находит первую запись нужной последовательности и быстро заполняет первую страницу.
Да и дальнейшая работа должна идти без видимых тормозов.
Если-же ты итак используешь страничную загрузку бровза и тормоза наблюдаются при листании страниц или прокрутке записей, то, скорее всего - или слабенькая сеть или она загружена до предела.
Потому, что приведенный тобой фильтр - простейший вариант выборки и VIEW с ним должен справлятся вообще без проблем.
=============================
С уважением, Олег А. Руденко
Написал: ClaList(2)