Автор | Сообщение |
|
| |
Пост N: 2674
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.03.13 14:26. Заголовок: Scope vs Optimized Filter
1. Сейчас юзаю оптимизированные фильтры (очень удобно в SIX , ADS). Поставил фильтр и не важно на какой из индексов юзер переключится фильтр будет актуален и на нем. При добавлении записей тоже нет проблем. Считал показания Dbfilter (в общем случае) , снял фильтр и после завершения "операции" вернул фильтр на место. Речь идет только о работе с фильтрами в browse. В отчетах фильтрами я как правило не пользуюсь и выборки идут оптимально по индексам. 2. Хочется задачу перевести на Harbour , но в нем нет оптимизированых фильтров (ADS для Harbour не актуален и хочу уйти с него на LetoDB). В LetoDB так же нет оптимизированных фильтров и заменить их можно только на SCOPE или индексом CUSTOM ADDITIVE. Сustom Additive не вариант для сетевой базы да еще с большим весом самой базы. Поэтому отбросил пока этот вариант. Остался SCOPE. Работает идеально и быстрее оптимизированных фильтров. 3. Пока не представляю как оптимально и без больших доработок прикрутить SCOPE к пункту 1. Допустим юзер открыл базу в которой 5 индексов. Он может самостоятельно менять сортировку базы (переключая индексы). Понадобилось ему поставить фильтр (аля SCOPE , допустим есть и 6 индекс), он его ставит. И вот тут вопрос каков ключ должен быть у этого индекса что бы не нарушить текущую сортировку и вопрос 2: допустим SCOPE установлен, но при смене юзером сортировки , SCOPE нас покинет так как останется привязанным к 6 индексу и от фильтра аля SCOPE и следа не останется. Может есть у кого опыт перехода с фильтров в browse на scope ?
|
|
|
Ответов - 35
, стр:
1
2
All
[только новые]
|
|
|
| |
Пост N: 744
Зарегистрирован: 11.06.10
|
|
Отправлено: 06.03.13 14:43. Заголовок: Dima пишет: опустим..
Dima пишет: цитата: | опустим юзер открыл базу в которой 5 индексов. Он может самостоятельно менять сортировку базы (переключая индексы). Понадобилось ему поставить фильтр (аля SCOPE , допустим есть и 6 индекс), он его ставит. И вот тут вопрос каков ключ должен быть у этого индекса что бы не нарушить текущую сортировку |
|
Дима, Вы бы показали кусок кода с фильтром, легче было бы понять как scope прикрутить.
|
|
|
|
| постоянный участник
|
Пост N: 150
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.03.13 17:16. Заголовок: Dima пишет:Пока не п..
Dima пишет: цитата: | Пока не представляю как оптимально и без больших доработок прикрутить SCOPE к пункту 1 |
| В Clipper с SIX имею в проге к dbf 48 индексов именно для Scope, Filter использовал только как дополнение к Scope в формах. Работает более 10 лет без проблем. Думаю вряд ли CDX Harbour менее надежен.
|
|
|
|
| |
Пост N: 2675
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.03.13 17:59. Заголовок: SergKis пишет: В C..
SergKis пишет: цитата: | В Clipper с SIX имею в проге к dbf 48 индексов именно для Scope |
| Жесть. Они у тебя как теги или каждый индекс в отдельном файле ? Если в отдельном то там ограничение на 15 индексов всего.
|
|
|
|
| Администратор
|
Пост N: 2720
Зарегистрирован: 23.05.05
|
|
Отправлено: 06.03.13 19:28. Заголовок: Dima пишет: Допусти..
Dima пишет: цитата: | Допустим юзер открыл базу в которой 5 индексов. Он может самостоятельно менять сортировку базы (переключая индексы). Понадобилось ему поставить фильтр (аля SCOPE , допустим есть и 6 индекс), он его ставит. И вот тут вопрос каков ключ должен быть у этого индекса что бы не нарушить текущую сортировку и вопрос 2: допустим SCOPE установлен, но при смене юзером сортировки , SCOPE нас покинет так как останется привязанным к 6 индексу и от фильтра аля SCOPE и следа не останется. |
| В общем случае решения эта задача не имеет, так как два управляющих индекса одновременно: один для фильтра, другой для сортировки установить нельзя. А разве в six можно ? Там ограничения точно такие же, чудес не бывает.
|
|
|
|
| |
Пост N: 2676
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.03.13 19:47. Заголовок: Позже накидаю пример..
Позже накидаю пример что бы ясно было чего же я хочу
|
|
|
|
| постоянный участник
|
Пост N: 151
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.03.13 19:48. Заголовок: Dima пишет:Жесть. Он..
Dima пишет: цитата: | Жесть. Они у тебя как теги или каждый индекс в отдельном файле ? |
| Как теги. Такую ситуацию не планировал. Начинал с 5 или с 7 уже не помню, но как всегда надо вчера и быстро разные просмотры Browse, Achoice и в течении года накапало. Добавляю теги с опаской, что развалится нах, ан нет - работает. База 22-70М, SMT 55M, словом действительно жесть, но работает.
|
|
|
|
| постоянный участник
|
Пост N: 152
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.03.13 20:04. Заголовок: The Mach SIx Query O..
The Mach SIx Query Optimizer: Скрытый текст
The Mach SIx Query Optimizer The Mach SIx Query Optimizer is an integrated system that provides high-speed query optimization for SET FILTER and other selected Clipper commands when used with a FOR condition. Mach SIx optimizes queries by following a procedural set of steps that determine the best access plan to retrieve the requested set of data. Mach SIx's primary focus is on the existence of index key expressions in the FOR criteria of its supported commands and functions. Using this information, Mach SIx is able to directly search the index files to satisfy all or part of the query without ever having to access the database. Once it becomes necessary to query the physical database, Mach SIx only queries the set of records found to meet the condition based on the data in the index files. This means that including just one indexed expression, in the FOR condition, has the potential to narrow the scope of the query to a very small set of the original file. This translates to incredible speed gains for any optimized command that contains one or more index key expressions. Queries that used to take minutes, now return in seconds. In some cases, you will experience performance increases that are magnitudes above standard Clipper. It's completely done for you in the background. If Mach SIx is unable to optimize the query condition, it simply turns control over to standard Clipper, but when it can, you'll see Clipper sail, and sail like it never has before.
|
|
|
|
|
| |
Пост N: 2677
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.03.13 13:27. Заголовок: Структура базы ..
Структура базы "naim","c",20,0 "kod1","n",2,0 "kod2","n",2,0 "kod3","n",2,0 есть 4 индекса indeks on naim to test1 indeks on kod1 to test2 indeks on kod2 to test3 indeks on kod3 to test4 К базе подключены в следующем порядке use test index test1,test2,test3,test4 Индексы test2,test3,test4 созданы только лишь для оптимизированных фильтров по этим полям. База всегда (в Browse) должна быть отсортирована по алфавиту (поле naim). Ставить нужно примерно вот такие фильтры Set filter to kod1==3 Set filter to kod2==77 Set filter to kod3==12 Set filter to kod1==1 .and. kod2==76 .and. kod3==3 и тд и тп Все эти фильтры будут оптимизированы. Для того что бы реализовать это через Scope , ну скажем вот такой фильтр Set filter to kod1==3 Необходимо иметь индекс с ключиком str(kod1,2)+naim и ставим фильтр: Set scope to " 3"," 3" Аналогично подходим к фильтру Set filter to kod1==1 .and. kod2==76 .and. kod3==3 Необходимо иметь индекс с ключиком str(kod1,2)+str(kod2,2)+str(kod3,2)+naim и ставим фильтр: Set scope to " 1"+"76"+" 3"," 1"+"76"+" 3" Если же на том же индексе надо установить фильтр вида Set filter to kod3==3 То вероятно Scope будет выглядеть так Set scope to " 0"+" 0"+" 3","99"+"99"+" 3" Я вообще правильно подхожу к Scope ? ;)
|
|
|
|
| постоянный участник
|
Пост N: 153
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.03.13 14:43. Заголовок: Dima пишет:Я вообще ..
Dima пишет: цитата: | Я вообще правильно подхожу к Scope ? |
| На мой взгляд надо: indeks on naim to test1 indeks on kod1+naim to test2 indeks on kod2+naim to test3 indeks on kod3+naim to test4 indeks on kod1+kod2+kod3+naim to test5 Чтобы не таскать в идекс все наименование, часто достаточно upper(left(naim, 7)) Использовать Scope без filter: Setscope(0,' 3'); Setscope(1,' 3') // 2-4 indeks Setscope(0,' 0 0 3'); Setscope(1,'9999 3') // 5 indeks можно добавить буквы - добавится обрезка на наименование: Setscope(0,' 3A'); Setscope(1,' 3A') // 2-4 indeks Setscope(0,' 0 0 3C'); Setscope(1,'9999 3C') // 5 indeks
|
|
|
|
| |
Пост N: 2678
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.03.13 14:46. Заголовок: А разве индекс Serg..
А разве индекс SergKis пишет: цитата: | indeks on kod1+kod2+kod3+naim to test5 |
| Не заменит вот эти 3 ? SergKis пишет: цитата: | indeks on kod1+naim to test2 indeks on kod2+naim to test3 indeks on kod3+naim to test4 |
|
|
|
|
|
| постоянный участник
|
Пост N: 154
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.03.13 14:57. Заголовок: Dima пишет:Не замени..
Dima пишет: Для Scope нет. Вы же хотите Set scope " 1"+"76"+" 3"," 1"+"76"+" 3" Этот scope частично замет test2, если отбросить наименование. Вы задаете Scope ключ слева по длине не > длины от индексного выражения, т.е. для index5 можно задать " 1"+"76" и " 1"+"7" и " 1"+"76"+" " и " 1"+"76"+" 3"+"ABC"
|
|
|
|
|
| |
Пост N: 2679
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.03.13 15:03. Заголовок: SergKis пишет: Для ..
SergKis пишет: Не так меня поняли видимо. Я имел в виду что индекс вида indeks on kod1+kod2+kod3+naim to test5 в состоянии решить все виды SCOPE которые предоставляют вот эти 3 индекса indeks on kod1+naim to test2 indeks on kod2+naim to test3 indeks on kod3+naim to test4 Зачем заводить 3 идекса если можно сделать один который решит те же задачи по SCOPE. Или я не прав ?
|
|
|
|
| Администратор
|
Пост N: 2721
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.03.13 15:06. Заголовок: Dima пишет: Структу..
Dima пишет: цитата: | Структура базы "naim","c",20,0 "kod1","n",2,0 "kod2","n",2,0 "kod3","n",2,0 есть 4 индекса indeks on naim to test1 indeks on kod1 to test2 indeks on kod2 to test3 indeks on kod3 to test4 К базе подключены в следующем порядке use test index test1,test2,test3,test4 Индексы test2,test3,test4 созданы только лишь для оптимизированных фильтров по этим полям. База всегда (в Browse) должна быть отсортирована по алфавиту (поле naim). Ставить нужно примерно вот такие фильтры Set filter to kod1==3 Set filter to kod2==77 Set filter to kod3==12 Set filter to kod1==1 .and. kod2==76 .and. kod3==3 и тд и тп Все эти фильтры будут оптимизированы. |
| А разве six и ads решает эту задачу ? Здесь как раз имеется различные индексы для фильтра (2,3,4) и для сортировки (1). А два управляющих индекса одновременно использовать нельзя. Одно индексное выражение должно решать обе эти задачи. Фильтр по scope может быть только по левой части индексного выражения.
|
|
|
|
| постоянный участник
|
Пост N: 155
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.03.13 15:07. Заголовок: Dima пишет:решит те ..
Dima пишет: цитата: | решит те же задачи по SCOPE. |
| Как задать scope по index5 только для kod3+name или только для kod2+name, если слева в ключе kod1 ?
|
|
|
|
| |
Пост N: 2680
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.03.13 15:11. Заголовок: SergKis пишет: Как ..
SergKis пишет: цитата: | Как задать scope по index5 только для kod3+name или только для kod2+name, если слева в ключе kod1 ? |
| Легко. Если kod2,kod1,kod3 цифры я же показывал такую выборку Dima пишет: цитата: | Необходимо иметь индекс с ключиком str(kod1,2)+str(kod2,2)+str(kod3,2)+naim и ставим фильтр: Set scope to " 1"+"76"+" 3"," 1"+"76"+" 3" Если же на том же индексе надо установить фильтр вида Set filter to kod3==3 То вероятно Scope будет выглядеть так Set scope to " 0"+" 0"+" 3","99"+"99"+" 3" |
| то есть для kod1 и kod2 я указал нижнюю и верхнюю границы то есть выбраны будут все записи с любыми kod1 и kod2 и kod3==3 Pasha пишет: цитата: | Фильтр по scope может быть только по левой части индексного выражения. |
| Да я понял это. Pasha пишет: цитата: | А два управляющих индекса одновременно использовать нельзя. |
| я про такое и не говорил , возможно я не так выразился и меня поняли не верно ;)
|
|
|
|
| постоянный участник
|
Пост N: 156
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.03.13 15:26. Заголовок: Dima пишет:Легко. Ес..
Dima пишет: цитата: | Легко. Если kod2,kod1,kod3 цифры я же показывал такую выборку |
| Для kod3 да, а для только kod2+name нет, т.е. index5 частично что то решает. Так у меня и появились 48 тегов у dbf.
|
|
|
|
| |
Пост N: 2681
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.03.13 15:30. Заголовок: SergKis пишет: Для ..
SergKis пишет: цитата: | Для kod3 да, а для только kod2+name |
| Да точно так же решается
|
|
|
|
| |
Пост N: 745
Зарегистрирован: 11.06.10
|
|
Отправлено: 07.03.13 15:33. Заголовок: SergKis пишет: На м..
SergKis пишет: цитата: | На мой взгляд надо: indeks on naim to test1 indeks on kod1+naim to test2 indeks on kod2+naim to test3 indeks on kod3+naim to test4 indeks on kod1+kod2+kod3+naim to test5 |
| Достаточно: indeks on naim+kod2 to test3 indeks on naim+kod3 to test4 indeks on naim+kod1+kod2+kod3 to test5 индекс test5 будет удовлетворять и test1: setscope(0,"naim") setscope(1,"naim") и test2 setscope(0,"naim"+"kod1") setscope(1,"naim"+"kod1")
|
|
|
|
| |
Пост N: 746
Зарегистрирован: 11.06.10
|
|
Отправлено: 07.03.13 15:51. Заголовок: Еще поясню, есть у м..
Еще поясню, есть у меня такое индексное выражение "TBN+STR(Y0,4,0)+STR(M0,2,0)+STR(VOU)" Выбираем: все записи по конкретному таб ном ordscope(0," 1") ordscope(1," 1") все записи по конкретному таб ном + по заданному году ordscope(0," 1"+"2013") ordscope(1," 1"+"2013") все записи по конкретному таб ном + по заданному периоду года ordscope(0," 1"+"2010") ordscope(1," 1"+"2013") все записи по конкретному таб ном + по заданному году + по заданному месяцу ordscope(0," 1"+"2013"+" 1") ordscope(1," 1"+"2013"+" 1") все записи по конкретному таб ном + по заданному году + по заданному месяцу+по заданному виду ordscope(0," 1"+"2013"+" 1"+"100") ordscope(1," 1"+"2013"+" 1"+"100") Т.е. как уже говорили, начинаем с левой части индексного выражения.
|
|
|
|
| |
Пост N: 2682
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.03.13 15:53. Заголовок: Еще примерчик. ind..
Еще примерчик. index on str(kmcod,6)+str(codgr,6) to klient ordscope(0," 0") ordscope(1," 3") Выберет из базы записи с kmcod от 0 до 3 включительно , проверил пашет ordscope(0," 3"+" 61") ordscope(1," 3"+" 61") Выберет из базы записи с kmcod 3 и codgr==61 , проверил пашет А вот так не работает как ожидалось ordscope(0," 0"+" 61") ordscope(1," 3"+" 61") то есть выборка по kmcod правильная а по codgr нет и встречаются записи с codgr # 61 где я не прав ? Выходит что если задана правая и левая часть то в этом случае в левой части не может быть задан диапазон , в то время как в правой части это допустимо. То есть так не сработает правильно ordscope(0," 0"+" 61") ordscope(1," 3"+" 61") А вот такого плана Scope сработает верно ordscope(0," 3"+" 61") ordscope(1," 3"+" 77")
|
|
|
Ответов - 35
, стр:
1
2
All
[только новые]
|
|