原文可见 这里,原作者 Robert CemperRobert 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>
} }