文章
· 六月 10 阅读大约需 2 分钟

类定义中如何使用列式存储

列式存储是 InterSystems IRIS 提供的一项较新的技术。与传统的基于行的存储不同,它通过将数据存储在列而不是行中来优化查询处理,从而实现更快的访问和检索相关信息。

 

下面是使用SQL创建此类表的例子

CREATE TABLE table (column1 type1, column2 type2, column3 type3) WITH STORAGETYPE = COLUMNAR  -- ex 1
CREATE TABLE table (column1 type1, column2 type2, column3 type3 WITH STORAGETYPE = COLUMNAR)  -- ex 2

我们知道InterSystems IRIS 是支持多模型的DMBS, 它可以无缝的通过关系型或对象的方式访问通一数据,

我们使用下面的方式在使用Object Script类定义的时候定义列存储:

1. 如果你想对类中的所有属性都定义为列存储,则直接通过在类中添加parameter 的方式实现:

Parameter STORAGEDEFAULT = "columnar" 

如前面的例子,我们使用object script定义就会是这样:

Class Post.Address Extends %Persistent [Final]
{
Parameter STORAGEDEFAULT = "columnar";
Parameter USEEXTENTSET=1;
Property City As %String(MAXLEN = 12);
Property ZIP As %String(MAXLEN = 9);
Property Country As %String(MAXLEN = 12);
}

其中 Parameter STORAGEEDFAULT = "columnar" 告诉系统,所有数据都以列的方式保存(意味着每一列都有其自己的global节点)

Parameter USEEXTENTSET = 1 告诉系统,为了生成的效率,hashed 的global 使用短名称命名。

你可以将任意表定义为使用列存储。但是将列存作为默认存储模式的表,必须添加Final 或 NoExtent 的类关键字,也就是不能再被继承。

 

2. 也可以仅对表中的某些字段定义为使用列式存储,要实现此种设计进需要在属性上添加 STORAGEDEFAULT = "columnar"

Class Post.Address Extends %Persistent
{
Parameter STORAGEDEFAULT = "row";
Parameter USEEXTENTSET=1;
Property City As %String(MAXLEN = 12);
Property ZIP As %String(MAXLEN = 9);
Property Country As %String(MAXLEN = 12, STORAGEDEFAULT = "columnar");
}

这个例子中的City 和 ZIP 仍使用行式存储,也就是数据会存储在global ^Post.AddressD 中,而Country会以列式的方式存储在不同的global节点中。

在这个例子中,使用列式存储会是一个更好的方法,因为如果我们有一个包含不同国家不同城市的数据库,国家的数目是有限的,而城市的数目则不是。

 

3. 还可以对现有行存储的类,针对某些字段添加列式索引

Class Sample.BankTransaction Extends %Persistent [ DdlAllowed ]
{
   // Line below is optional
   Parameter STORAGEDEFAULT = "row";
   Property Amount As %Numeric(SCALE = 2);
   Index AmountIndex On Amount [ type = columnar ];
   .
   .
   .
}

在这个例子中,金额这样的数字类型字段,使用行式存储,但对其建立列式索引,会极大提高针对该字段的统计类sql查询效率,比如SUM、Avg等。

讨论 (0)1
登录或注册以继续