Форум » [x]Harbour » REINDEX ... » Ответить

REINDEX ...

Andrey: Всем привет ! Не пользовался этой командой вообще. Делал закрытие индексов и создание нового индекса. А как сделать REINDEX на драйвере CDX без закрытия индексов ? Для простоты я использую один файл - один индекс. Так привык давно делать, да и удобнее по Dbsetorder() переключаться. Делаю так: [pre2] SET AUTOPEN ON USE ( cDbf ) ALIAS TEST SHARED NEW // подключается автоматом test6.cdx OrdSetFocus('ALL') Dbsetorder(1) .... // cUser := "1-user", "2-user" и т.д. cIndx := GetStartUpFolder() + "\test6." + cUser + '.cdx' DELETEFILE(cIndx) // обязательно SELECT TEST INDEX ON RECNO() TAG CODE1 TO (cIndx) FOR &cFilter ADDITIVE // условный индекс OrdSetFocus('CODE1') Dbsetorder(2) GO TOP ...[/pre2] Пытаюсь потом в программе сделать: [pre2] SELECT(oBrw:cAlias) nOrder := INDEXORD() IF nOrder == 2 // перестроить индекс REINDEX // строка 897 ENDIF[/pre2] Вылетает с ошибкой: Error DBFCDX/1023 Exclusive required: W:\HB_Project\Tsb_Basic\Demo6\test6.dbf --------------------------------- Stack Trace --------------------------------- Called from ORDLISTREBUILD(0) Called from RECNOREFRESH(897) in module: demo6.prg Called from CHANGEWINBROWSE(1037) in module: demo6.prg Called from (b)MAIN(47) in module: demo6.prg

Ответов - 26, стр: 1 2 All

SergKis: MIKHAIL пишет Индекс как то может помочь если по нему многократные выборки делаешь... У Андрея, это совместимость очень старого кода (что бы не править во всех прогах куски текстов wvt\gui). Один, динамический тэг для разных user (по именам файлов индекса каждому) и userов не так много.

MIKHAIL: Pasha пишет: хоть не оптимизируй - работает одинаково. Ну не скажите, можно заставить работать и суперкомпьютер как доисторическую черепаху... вопрос скорее в дензнаках вложенных либо в железо либо в мозги... смотря какие возможности и предпочтения.... на мой взгляд 1С яркий тому пример SergKis пишет: что бы не править во всех прогах ну судя по посту все же частично правит код, поэтому наверное проще вообще выкинуть построение индекса, если он одноразово используется... а если по нему выборки постоянно, без перестроения, тогда другое дело... Правильно нужно определить и использовать один общий постоянный индекс для всех, что бы ускорить выборку если оно того стоит...

SergKis: MIKHAIL пишет Правильно нужно определить и использовать один общий постоянный индекс для всех, что бы ускорить выборку если оно того стоит... В том то и дело, что клиент набирает из списка условий, нужные в конкретном запросе на данный момент и далее командой индекса этот запрос выполняется, можно конечно ставить scope, filter и делать выборку, но у Андрея так со времен clipper. Возможный вариант, да и код менять не надо под новую выборку - работает и устраивает его. Говорили с Андреем на эту тему.


Andrey: MIKHAIL пишет: 59 тыс база не большая, и если для выборки каждый раз индекс создаешь, то по сути делаешь двойную работу. Индекс как то может помочь если по нему многократные выборки делаешь... Кол-во записей у каждой фирмы по разному. Это средняя фирма, с кол-вом абонентов 59тыс.записей. Операция разовая, сделал и забыл. Просто привёл её в качестве примера, что код стал оптимизирован и время на операцию уменьшилось. Ранее не делал такого.

Andrey: MIKHAIL пишет: ну судя по посту все же частично правит код, поэтому наверное проще вообще выкинуть построение индекса, если он одноразово используется... а если по нему выборки постоянно, без перестроения, тогда другое дело... Правильно нужно определить и использовать один общий постоянный индекс для всех, что бы ускорить выборку если оно того стоит... Конечно код переделываю. Переполз из терминалки на МиниГуи. Ускорение работы программы заметно по базе так очень. Единственно что с окнами задержка, медленно строятся. Карточка большая и при каждом вызове постоянно строится карточка. В терминалке карточка быстрей строится. Но наверное это тоже со временем решу, строить карточку постоянную при старте задачи. Нужно 5 карточек строить, а потом показывать под разные данные. С индексами работаю по разному. Открываю базы с постоянными индексами. Например есть постоянный индекс по адресу, при выборке строю условный индекс по нему, индекс создаётся в разы быстрей. Даже на больших базах 100 тыс. записей (кол-во заявок за несколько лет) построение условного индекса без существующих индексов операция довольно быстрая на локальном компе. Поиск по разным полям базы, включая мемо-поля. Как сделать такой поиск без условного индекса - я даже не знаю. 400 полей в базе, что юзеру придёт в голову искать, даже не думаю. Есть карточка с выбором условий - ищи что хочешь и ко мне не приставай. В сетке такие операции у меня редко кто делает. В качестве примера приводил поиск по 1 млн.записей на ЛетоДБ - там по сети всё летает. https://abonent4.ru/letodb/ SergKis пишет: да и код менять не надо под новую выборку - работает и устраивает его. Не совсем правильно. Юзеров такой поиск устраивает. На другое он не согласен. Зачем тогда переделывать, работа будет невостребована и просто выкинута в мусорку.

MIKHAIL: Andrey пишет: 400 полей в базе, что юзеру придёт в голову искать, даже не думаю. Ну если правильно понял, то набор условий FOR для индекса задает сам пользователь, на основании чего строишь индекс, а затем отобранные записи добавляешь в массив данных, после чего индекс не нужен. Если так, то нет смысла строить индекс, и потом еще раз обходить его для добавления этих записей в массив. Просто сразу делай обход всей базы данных или части на основании базового индекса с тем условием что задает пользователь. В противном случае двойная работа, а то и тройная, так как добавление записи в индекс это не одна операция... Andrey пишет: код стал оптимизирован и время на операцию уменьшилось думаю без индекса скорость возрастет в 2-3 раза



полная версия страницы