Главная » Статьи » Рефераты » Без категории |
Евгений Каратаев Индексы - это структуры данных, размещаемые параллельно и поддерживаемые синхронно основным структурам данных и имеющие основным назначением поддержание структур данных, ориентированных на ускорение поиска или оптимизацию хранения основных данных. Здесь под основными данными понимаются данные, хранение и работа с которыми является основным назначением системы базы данных. При использовании основных данных система базы данных выполняет операции вставки, поиска, удаление и изменения в массиве основных данных. При использовании дополнительных индексных структур система параллельно обновляет индексные структуры при изменении (вставке, изменении и удалении) основных данных и в некоторых случаях получает возможность использовать индексные структуры, ориентированные на поиск данных. Наличие такой возможности определяется характеристиками индекса. Как следует из вышеприведенного, введение индексов в систему базы данных утяжеляет операции связанные с изменением данных но ускоряет операции связанные с поиском и, как обычно, следствие этого, выборкой данных. Индексные структуры сами по себе обычно не являются необходимыми для работы системы базы данных. И их применение определяется программистом или администратором системы. В большинстве общераспространенных систем баз данных поддержка индексных структур и их использование выполняется автоматическими средствами. В этой работе мы будем составлять структуры и алгоритмы, которые можно использовать вне автоматики и пользоваться всеми возможностями безотносительно ограничений системы базы данных. Примерно как если бы по частям реализовали внутренние механизмы большой системы, но в несколько упрощенном варианте.
Индексная структура по своему состоянию должна соответствовать состоянию индексируемых данных. Поэтому операции обновления индексов обычно делят на две группы - динамическое обновление индексных структур при обновлении одной записи и массовые операции удаления / построения индексов. Далее будем рассматривать строки данных, устроенные для простоты следующим образом: идентификатор записи получаем инкрементом ноду ^Data значение записи хранится в узле ^Data(id) запись состоит из полей с разделителем ~ (тильда) индексные записи храним с глобале ^Index в записи предполагаем поля - фигура, цвет, количество общее строение записи: ^Data(id)=Figure~Color~Count Операции динамического обновления индексов могут быть встроены в виде вызова из операции обновления записи и либо предшествовать собственно сохранению основной записи, либо последовать ему, либо обрамлять. Например: ; просто сохранение объекта SaveObject(id,ObjVal) i '+$g(id) s id=$i(^Data) s ^Data(id)=ObjVal q ; обновление индексов перед сохранением SaveObject(id,ObjVal) n OldValue i '+$g(id) s id=$i(^Data) s OldValue=$g(^Data(id)) d DeleteIndices(id,OldValue) s ^Data(id)=ObjVal q ; обновление индексов после сохранения SaveObject(id,ObjVal) n OldValue i '+$g(id) s id=$i(^Data) s OldValue=$g(^Data(id)) s ^Data(id)=ObjVal d DeleteIndices(id,OldValue) q ; обрамление обновления индексов при сохранении SaveObject(id,ObjVal) i '+$g(id) s id=$i(^Data) d DeleteIndices(id,$g(^Data(id))) s ^Data(id)=ObjVal q l +^Data(id) s ^Data(id)=ObjVal l -^Data(id) Различие в режиме перестроения индекса, а именно что раньше появится в базе - индексная запись или запись с данными, позволяет построить в некотором смысле самовосстанавливающуюся систему, которая будет иметь возможность восстановитсья в случае сбоя при записи строки данных. Если индекс построен раньше, то при выборке по индексу функция выборки данных может определить что индексная запись существует но ей не соответствует строка данных. В случае применения блокировок в операции обновления записи мы в функции выборки можем также попытаться заблокировать эту же запись и если блокировка оказалась успешной но записи нет, или ее состояние не соответствует индексным значениям, то значит что операция записи самой строки данных была неуспешной и следует просто удалить индексную запись. Механизм довольно громоздкий, но в ситуации когда из соображений эффективности не хочется применять транзакции, может оказаться полезным. Вопрос выбора стратегии обновления индекса при обновлении записи оставим программисту. Операция перестроения индекса сводится к удалению всех индексных записей и перебору всех имеющихся записей с данными и построения индексных записей по каждой имеющейся записи данных. Полагаем, что есть функции DeleteIndex для удаления всех индексных записей по одному индексу. Тогда перестроение индекса может выглядеть как UpdateIndex(IndexName) dDeleteIndex(IndexName) n id,ObjValue s id="" f s id=$o(^Data(id),ObjValue) q:id="" d Q | |
Просмотров: 284 | |
Всего комментариев: 0 | |