文章
· 九月 5, 2022 阅读大约需 3 分钟

物化视图(Materialized Views)以及基于索引类构建类的例子

原文可见 这里,原作者 Robert Cemper

我们在SQL中的经常被提到视图VIEW,基本上是一段预先设计好的SQL语句,它也像任何其他SQL查询语句一样执行和组装。

而物化视图MATERIALIZED VIEW意味着查询的内容是预先收集的,这些数据可以相当快地进行检索。

我第一次看到这个概念是和我最喜欢的竞争对手O* 一起的,他们对此功能发出了很多的声音。

然而在Caché/IRIS中,这种功能几乎是一早就存在的,我们认为这是很正常的普通功能。只是我们大多数开发人员只是没有意识到这一点,只要稍加润色,它就可以作为一个优秀的特性呈现出来。 此外,任何更新和维护都是作为内置的能力进行的,无需开发人员任何额外的工作。

看下面的例子:

在我们的Sample.Person类中,我们可以定义一个索引

/// Define an index for <property>Name</property>.
Index NameIDX On Name [ Data = (Name, Home.State, SSN) ];

正如我们预想的那样,在执行下面的查询时,它会非常的快

SELECT ID, Name, Home_State, SSN   from Sample.Person

因为这个查询所涉及到的内容都来来自索引global ^Sample.PersonI("NameIDX"),并没有一点对原数据global的加载。

这就是基本的物化视图功能,并且它的更新完全是自动的。

如果你想定义一个视图,那么可以这么做

Class Sample.Person.NameView [ ClassType = view
                             , CompileAfter = Sample.Person
                             , DdlAllowed
                             ,  Not ProcedureBlock
                             , SqlTableName = NameView
                             , ViewQuery = { SELECT ID
                                                  , Name
                                                  , Home_State
                                                  , SSN
                                                    from Sample.Person  } ]
       { Parameter READONLY = 1; }

但是如果你想更舒适一点,比如做数据的反向链接,你可以映射索引global本身。

下面的例子可以应用隐式JOIN语法并获得一个功能完整的表,如下所示

SELECT Name, BaseClass->DOB, HomeState, SSN,"%CLASSNAME",BaseClass FROM Sample_Person.NameIDX

/// mapped index
/// Index NameIDX On Name [ Data = (Name, Home.State, SSN) ];
Class Sample.Person.NameIDX Extends %Persistent [ Final ]
{
Property IndexName As %String [ InitialExpression = "NameIDX", ReadOnly ];
Property SQLUPPERname As %String [ ReadOnly ];
Property BaseClass As Sample.Person [ ReadOnly ];
Index min On (IndexName, SQLUPPERname, BaseClass) [ IdKey ];
/// Classname of Index Source
Property %CLASSNAME As %String [ ReadOnly ];
/// Person's name.
Property Name As %String [ ReadOnly ];
/// Person's home address. This uses an embedded object.
Property HomeState As %String [ ReadOnly ];
/// Person's Social Security number. This is validated using pattern match.
Property SSN As %String(PATTERN = "3N1""-""2N1""-""4N") [ ReadOnly ];
Parameter READONLY = 1;
Parameter MANAGEDEXTENT As INTEGER = 0;
Storage Default
{
 <Data name="NameIDXDefaultData">
  <Value name="1">
    <Value>%CLASSNAME</Value>
  </Value>
  <Value name="2">
    <Value>Name</Value>
  </Value>
  <Value name="3">
    <Value>HomeState</Value>
  </Value>
  <Value name="4">
    <Value>SSN</Value>
  </Value>
 </Data>
 <DataLocation>^Sample.PersonI</DataLocation>
 <DefaultData>NameIDXDefaultData</DefaultData>
 <IdLocation>^Sample.Person.NameIDXD</IdLocation>
 <IndexLocation>^Sample.Person.NameIDXI</IndexLocation>
 <StreamLocation>^Sample.Person.NameIDXS</StreamLocation>
 <Type>%Library.CacheStorage</Type>
} }
讨论 (0)1
登录或注册以继续