Monday, October 13, 2008

Работа с индексами (DBF-файлы)


Для организации упорядочивания содержимого файла БД и поиска в ней по значению одного или нескольких полей применяется механизм индексов. Его применение можно сравнить с сортировкой картотеки по определенному признаку (совокупности признаков). Однако, в отличие от картотеки, файл БД может иметь сразу несколько индексов, и, соответственно, являться упорядоченным одновременно по нескольким признакам. Индексы хранятся в индексном файле. Индексный файл может содержать информацию более чем об одном индексе. Рекомендуется для одного файла DBF иметь один индексный файл, в котором хранятся все индексы для этого файла.


Каждый индекс имеет наименование, признак уникальности, выражение индекса и фильтр. Наименование индекса используется для идентификации индекса. Выражение индекса и фильтр представляют собой написанные на специальном языке выражения, вычисление значения которых для каждой записи позволяет определить ее место при упорядочивании и необходимость помещения ее в упорядоченный список (индекс может содержать упоминание не обо всех записях таблицы, а только об удовлетворяющих выражению фильтра). Уникальный индекс (имеющий установленным признак уникальности) позволяет иметь в индексе ссылки на записи только с различным значением индексного выражения.


Основное правило: индекс нужен, чтобы быстро искать нужную запись.


DBF-ФАЙЛ:


1 Иванов


2 Абдулов


3 Барабанов


4 Мирнов


5 Раскольников



6 Комаров


Индекс по фамилии (по алфавиту):


Абдулов 2


Барабанов 3


Иванов 1


Мирнов 4


Комаров 6


Раскольников 5


Нужно быстро найти Комаров. В неупорядоченном исходном файле искать его можно только последовательным перебором всех записей, что будет очень долго при большом числе записей. В индексе найти Комарова можно очень быстро, поскольку индекс отсортирован по полю Фамилия. При этом мы узнаем физический номер записи в файле DBF и производим прямое позиционирование на нужную запись.


После создания структуры базы данных можно добавить индексы следующим образом:


//Синтаксис: ДобавитьИндекс(<Название>, <Выражение>, <Уникальность>, <Убывание>, <Фильтр>)


Файл = СоздатьОбъект(“XBase”);


Файл.ДобавитьПоле(“NAME”, 1, 19, 3);


Файл.ДобавитьПоле(“PRICE”, 2, 25, 0);


Файл.ДобавитьИндекс(“IDXCODE”, “CODE”, 1, 0, “”);


Файл.ДобавитьИндекс(“IDXNAME”, “NAME”, 0, 0, “”);


Файл.ДобавитьИндекс(“IDXNAMECODE”, “NAME+CODE”, 0, 0, “”);


Файл.СоздатьФайл(“mydb.dbf”, “mydb.cdx”);


//1-й вариант


Файл.ТекущийИндекс(“IDXNAME”);


Файл.Найти(“Иванов”,0); //передается значение и режим поиска


//2-й вариант


Файл.ТекущийИндекс(“IDXNAMECODE”);


Файл.Ключ.NAME = “Иванов”;


Файл.Ключ.CODE = 123;


Файл.НайтиПоКлючу(0);


//после сбоя рекомендуется заново переформировать все индексы

Файл.Переиндексировать();


В 1С существует специальный язык для задания выражений и фильтра индекса. Подробнее о нем, смотрите в документации на встроенный язык.









































No comments: