原文可见 [这里](https://community.intersystems.com/post/materialized-views),原作者 [Robert Cemper](https://community.intersystems.com/user/robert-cemper-0) 我们在SQL中的经常被提到视图VIEW,基本上是一段预先设计好的SQL语句,它也像任何其他SQL查询语句一样执行和组装。 而物化视图MATERIALIZED VIEW意味着查询的内容是预先收集的,这些数据可以相当快地进行检索。 我第一次看到这个概念是和我最喜欢的竞争对手O* 一起的,他们对此功能发出了很多的声音。 然而在Caché/IRIS中,这种功能几乎是一早就存在的,我们认为这是很正常的普通功能。只是我们大多数开发人员只是没有意识到这一点,只要稍加润色,它就可以作为一个优秀的特性呈现出来。 此外,任何更新和维护都是作为内置的能力进行的,无需开发人员任何额外的工作。 看下面的例子: 在我们的Sample.Person类中,我们可以定义一个索引
<span class="hljs-comment">/// Define an index for <property>Name</property>.</span>
Index NameIDX On Name [ Data = (Name, Home.State, SSN) ]<span class="hljs-comment">;</span>
正如我们预想的那样,在执行下面的查询时,它会非常的快
SELECT ID, Name, Home_State, SSN   from Sample.Person
因为这个查询所涉及到的内容都来来自索引global ^Sample.PersonI("NameIDX"),并没有一点对原数据global的加载。 这就是基本的物化视图功能,并且它的更新完全是自动的。 如果你想定义一个视图,那么可以这么做
<span class="hljs-keyword">Class</span> Sample.Person.NameView [ ClassType = <span class="hljs-keyword">view</span>
                             , CompileAfter = Sample.Person
                             , DdlAllowed
                             ,  Not ProcedureBlock
                             , SqlTableName = NameView
                             , ViewQuery = { SELECT ID
                                                  , Name
                                                  , Home_State
                                                  , SSN
                                                    from Sample.Person  } ]
       { <span class="hljs-keyword">Parameter</span> READONLY = <span class="hljs-number">1</span><span class="hljs-comment">; }</span>
但是如果你想更舒适一点,比如做数据的反向链接,你可以映射索引global本身。 下面的例子可以应用隐式JOIN语法并获得一个功能完整的表,如下所示
<span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">Name</span>, BaseClass->DOB, HomeState, SSN,<span class="hljs-string">"%CLASSNAME"</span>,BaseClass <span class="hljs-keyword">FROM</span> Sample_Person.NameIDX
![](https://community.intersystems.com/sites/default/files/inline/images/images/image-20200426192038-1.png)
<span class="hljs-comment">/// mapped index</span>
<span class="hljs-comment">/// Index NameIDX On Name [ Data = (Name, Home.State, SSN) ];</span>
<span class="hljs-keyword">Class</span> Sample.Person.NameIDX <span class="hljs-keyword">Extends</span> <span class="hljs-built_in">%Persistent</span> [ Final ]
{
<span class="hljs-keyword">Property</span> IndexName <span class="hljs-keyword">As</span> <span class="hljs-built_in">%String</span> [ InitialExpression = <span class="hljs-string">"NameIDX"</span>, ReadOnly ]<span class="hljs-comment">;</span>
<span class="hljs-keyword">Property</span> SQLUPPERname <span class="hljs-keyword">As</span> <span class="hljs-built_in">%String</span> [ ReadOnly ]<span class="hljs-comment">;</span>
<span class="hljs-keyword">Property</span> BaseClass <span class="hljs-keyword">As</span> Sample.Person [ ReadOnly ]<span class="hljs-comment">;</span>
Index min On (IndexName, SQLUPPERname, BaseClass) [ IdKey ]<span class="hljs-comment">;</span>
<span class="hljs-comment">/// Classname of Index Source</span>
<span class="hljs-keyword">Property</span> <span class="hljs-built_in">%CLASSNAME</span> <span class="hljs-keyword">As</span> <span class="hljs-built_in">%String</span> [ ReadOnly ]<span class="hljs-comment">;</span>
<span class="hljs-comment">/// Person's name.</span>
<span class="hljs-keyword">Property</span> Name <span class="hljs-keyword">As</span> <span class="hljs-built_in">%String</span> [ ReadOnly ]<span class="hljs-comment">;</span>
<span class="hljs-comment">/// Person's home address. This uses an embedded object.</span>
<span class="hljs-keyword">Property</span> HomeState <span class="hljs-keyword">As</span> <span class="hljs-built_in">%String</span> [ ReadOnly ]<span class="hljs-comment">;</span>
<span class="hljs-comment">/// Person's Social Security number. This is validated using pattern match.</span>
<span class="hljs-keyword">Property</span> SSN <span class="hljs-keyword">As</span> <span class="hljs-built_in">%String</span>(PATTERN = <span class="hljs-string">"3N1""-""2N1""-""4N"</span>) [ ReadOnly ]<span class="hljs-comment">;</span>
<span class="hljs-keyword">Parameter</span> READONLY = <span class="hljs-number">1</span><span class="hljs-comment">;</span>
<span class="hljs-keyword">Parameter</span> MANAGEDEXTENT <span class="hljs-keyword">As</span> INTEGER = <span class="hljs-number">0</span><span class="hljs-comment">;</span>
Storage Default
{
 <Data name=<span class="hljs-string">"NameIDXDefaultData"</span>>
  <Value name=<span class="hljs-string">"1"</span>>
    <Value><span class="hljs-built_in">%CLASSNAME</span></Value>
  </Value>
  <Value name=<span class="hljs-string">"2"</span>>
    <Value>Name</Value>
  </Value>
  <Value name=<span class="hljs-string">"3"</span>>
    <Value>HomeState</Value>
  </Value>
  <Value name=<span class="hljs-string">"4"</span>>
    <Value>SSN</Value>
  </Value>
 </Data>
 <DataLocation><span class="hljs-symbol">^Sample</span>.PersonI</DataLocation>
 <DefaultData>NameIDXDefaultData</DefaultData>
 <IdLocation><span class="hljs-symbol">^Sample</span>.Person.NameIDXD</IdLocation>
 <IndexLocation><span class="hljs-symbol">^Sample</span>.Person.NameIDXI</IndexLocation>
 <StreamLocation><span class="hljs-symbol">^Sample</span>.Person.NameIDXS</StreamLocation>
 <Type><span class="hljs-built_in">%Library.CacheStorage</span></Type>
} }