воскресенье, 22 мая 2016 г.

MUMPS: Индекс с условием на вставку

При поддержке индексных структур параллельно со структурами данных может быть использовано хранение не всех индексных записей, а лишь некоторых. Механизм поддержки индексов может использовать некоторое заданное условие для того, чтобы определить, следует ли вставлять индексную запись или нет.

При применении этого механизма следует обращать внимание, зависит ли условие вставки индексной записи только от значений атрибутов или также от иных факторов. Механизм удаления и обновления индексной записи может в первом случае использовать то же самое условие, либо производить удаление индексной информации всегда и независимо от результата вычисления условия.

Использование условной вставки индексной записи приводит к тому, что в индексы попадает информация не о всех записях данных. Этот факт может быть использован при выборке по условному индексу - при выборке мы автоматически получаем только те записи, которые удовлетворяют заданному условию. Этот метод может оказаться во много раз эффективнее применения сложной индексной структуры или сложных алгоритмов выборки по нескольким индексам.

Кроме простой реализации достаточно сложного условия можно отметить другие плюсы условной вставки индексов, такие как уменьшение объемов журналирования, ресурсов кеширования и дисковых операций.

Приведем пример условной вставки индексных записей. Здесь индексная запись по атрибуту Figure вставляется только если выполняется условие. При этом в условии проверяется что значение атрибута Count больше 1. При использовании индекса по атрибуту Figure мы автоматически получаем выборку с дополнительным условием Count > 1 - в выборку попадут только записи попадающие под это условие.
 CreateRecords()
 k ^Index
 k ^Data
 n i,Figures,Colors,Counts,Figure,Color,Count,id
 s Figures="квадрат~круг~отрезок~треугольник"
 s Colors="красный~зелёный~синий~белый"
 s Counts="2~5~12~8"
 f i=1:1:12 d
 . s Figure=$p(Figures,"~",$r(4)+1)
 . s Color=$p(Colors,"~",$r(4)+1)
 . s Count=$p(Counts,"~",$r(4)+1)
 . s id=$$InsertRecord(Figure_"~"_Color_"~"_Count)
 q
InsertRecord(RecordValues)
 n id s id=$i(^Data)
 l +^Data(id)
 s ^Data(id)=RecordValues
 d InsertIndexRecords(id,RecordValues)
 l -^Data(id)
 q id
DeleteRecord(id)
 q:'$d(^Data(id))
 l +^Data(id)
 n RecordValues s RecordValues=$g(^Data(id))
 d DeleteIndexRecords(id,RecordValues)
 k ^Data(id)
 l -^Data(id)
 q
UpdateRecord(id,RecordValues)
 q:'$d(^Data(id))
 l +^Data(id)
 n OldRecordValues s OldRecordValues=$g(^Data(id))
 d DeleteIndexRecords(id,OldRecordValues)
 s ^Data(id)=RecordValues
 d InsertIndexRecords(id,RecordValues)
 l -^Data(id)
 q
DeleteIndex(IndexName)
 k ^Index(IndexName)
 q
Condition(RecordValues)
 n Count
 s Count=$p(RecordValues,"~",3)
 q Count>1
InsertIndexRecords(id,RecordValues)
 i $$Condition(RecordValues) d
 . d InsertIndexRecord("Figure",id,$p(RecordValues,"~",1))
 d InsertIndexRecord("Color",id,$p(RecordValues,"~",2))
 d InsertIndexRecord("Count",id,$p(RecordValues,"~",3))
 q
DeleteIndexRecords(id,RecordValues)
 d DeleteIndexRecord("Figure",id,$p(RecordValues,"~",1))
 d DeleteIndexRecord("Color",id,$p(RecordValues,"~",2))
 d DeleteIndexRecord("Count",id,$p(RecordValues,"~",3))
 q
InsertIndexRecord(IndexName,id,Value)
 s ^Index(IndexName,Value,id)=""
 q
DeleteIndexRecord(IndexName,id,Value)
 k ^Index(IndexName,Value,id)
 q
Здесь мы при удалении индексной записи не проверяем условие, поскольку для выполнения команды kill не требуется существования соответствующего узла.

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

Как видно, наличие условия на вставку индексной записи никак не связано со структурой индекса - условие может быть комбинировано с любым типом индекса.

Применение индексов с условием на вставку, в действительности, исходя из характеристик таких индексов - это довольно тонкая задача. Если при проектировании системы вообще сначала неизвестно, какие именно задачи будет выполнять структура данных, то применение условного индекса может быть не оправдано из-за возрастания сложности разработки (увеличивается количество используемых сущностей). При тонкой настройке и оптимизации системы наоборот - один универсальный полный индекс может быть заменен на несколько условных. При такой замене можно прогнозировать небольшое замедление при обновлении записей данных и существенное ускорение при поиске по ним с использованием «специализированных» индексов.

Подробнее о книге "MUMPS СУБД"

Комментариев нет:

Отправить комментарий