Покрывающим индексом (cover index) называется индекс, который может быть
использован для нескольких задач выборки данных, в том числе для тех, для
которых он изначально не планировался. Название отражает не вид структуры, а
различные возможности ее применения.
Индекс в силу своей структуры есть отображение значений атрибутов на идентификаторы записей. Поэтому содержит как набор значений атрибутов, так и набор отображений. Практически любой индекс в силу своего строения является покрывающим для по крайней мере нескольких задач:
С точки зрения эффективности применение покрывающих индексов вполне оправдано, поскольку одна индексная структура может быть использована многократно в различных задачах. При этом чем больше атрибутов записи объединяет индекс, тем больше покрытий он обеспечивает. В случае применения межтабличных индексов эффективность покрывающего свойства многократно увеличивается, поскольку позволяет сократить число операций соединений.
Приведем демонстрационный пример поддержания структуры данных для записей с атрибутами Color и Figure, после чего приведем примеры использования одного и того же индекса в различных задачах:
Выбрать набор различных значений Color
Индекс в силу своей структуры есть отображение значений атрибутов на идентификаторы записей. Поэтому содержит как набор значений атрибутов, так и набор отображений. Практически любой индекс в силу своего строения является покрывающим для по крайней мере нескольких задач:
- Поскольку содержит набор значений атрибутов, может быть использован для выборки списка различных имеющихся значений атрибутов.
- Поскольку каждое значение атрибута отображается на набор идентификаторов записей, можно найти записи по заданному значению.
- Если значения атрибута находятся в некотором упорядочении, то можно получить сортировку по значениям атрибутов в этом упорядочении.
- Возможно определить, существует ли запись с заданным значением, и тогда можно реализовать ограничения различного рода, накладываемые на данные. В частности, запрет иметь значение "синий" более чем 5 записям одновременно.
- Выбрать набор различных значений Color
- Выбрать по заданному Color идентификаторы записей (применять вместо функции $O функцию $Q)
- Выбрать по заданному Color и Figure идентификаторы записей (применять функцию $O)
- Отсортировать идентификаторы по Color и Figure ($O)
- Выбрать идентификаторы для диапазона Color ($Q)
- Выбрать идентификаторы для диапазона Figure при задании Color ($O)
- Выбрать идентификаторы при задании диапазонов Color и Figure ($O по Color + вложенный $O по Figure) \item Для заданного Color отсортировать по Figure.
С точки зрения эффективности применение покрывающих индексов вполне оправдано, поскольку одна индексная структура может быть использована многократно в различных задачах. При этом чем больше атрибутов записи объединяет индекс, тем больше покрытий он обеспечивает. В случае применения межтабличных индексов эффективность покрывающего свойства многократно увеличивается, поскольку позволяет сократить число операций соединений.
Приведем демонстрационный пример поддержания структуры данных для записей с атрибутами Color и Figure, после чего приведем примеры использования одного и того же индекса в различных задачах:
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:120 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 InsertIndexRecords(id,RecordValues) d InsertIndexRecord("ColorFigure",id, $p((RecordValues),"~",2),$p((RecordValues),"~",1)) q DeleteIndexRecords(id,RecordValues) d DeleteIndexRecord("ColorFigure",id, $p((RecordValues),"~",2),$p((RecordValues),"~",1)) q InsertIndexRecord(IndexName,id,ColorValue,FigureValue) l +^Index(IndexName,ColorValue,FigureValue,id) s ^Index(IndexName,ColorValue,FigureValue,id)="" l -^Index(IndexName,ColorValue,FigureValue,id) q DeleteIndexRecord(IndexName,id,ColorValue,FigureValue) l +^Index(IndexName,ColorValue,FigureValue,id) k ^Index(IndexName,ColorValue,FigureValue,id) l -^Index(IndexName,ColorValue,FigureValue,id) qПриведем несколько примеров таких выборок различного назначения по одному и тому же индексу.
Выбрать набор различных значений Color
Select1() n Color s Color="" f s Color=$o(^Index("ColorFigure",Color)) q:Color="" d . w Color,! qВыбрать по заданному Color идентификаторы записей (применять вместо функции $O функцию $Q)
Select2(Color="красный") n ref s ref=$na(^Index("ColorFigure",Color)) f s ref=$q(@ref) q:$s(ref="":1,$qs(ref,2)'=Color:1,1:0) d . w $qs(ref,4),! qВыбрать по заданному Color и Figure идентификаторы записей (применять функцию $O)
Select3(Color="синий",Figure="квадрат") n id s id="" f s id=$o(^Index("ColorFigure",Color,Figure,id)) q:id="" d . w "Found id: "_id,! qОтсортировать идентификаторы по Color и Figure (\$O)
Select4(COrder=1,FOrder=-1) n c,f,id s c="" f s c=$o(^Index("ColorFigure",c),COrder) q:c="" d . s f="" f s f=$o(^Index("ColorFigure",c,f),FOrder) q:f="" d . . s id="" f s id=$o(^Index("ColorFigure",c,f,id)) q:id="" d . . . w c_" "_f_" "_id,! qПодробнее о книге "MUMPS СУБД"
Комментариев нет:
Отправить комментарий