存储模型是数据在磁盘上的物理组织结构。在许多介绍数据库的书籍里,存储模型又被称为内模型。它在很大程度上决定了数据的适用领域,是衡量数据存取性能的重要指标之一。

我们在数据块的基础上进行了行存储模型(NSM)和列存储模型(DSM)的设计。因为两种存储模型的组织结构完全不同,以下将结合上图和数据运作流程,来阐述这两种存储模型的特点及优劣。

见上图,这是一个网络音乐文件表,由6个属性组成。左侧是行存储模型,每一行由不同属性的列值组成,数据是从左到右、从上到下的排列,形成行与行连接的布局。右侧是列存储模型,同属性的列值被组织在一起,成为列的集合,数据是从上向下、从左到右的排列,形成列集合与列集合连接的布局。

行/列存储模型都是建立在数据块的基础上。CACHE状态时,数据的读/写处理都在内存中进行,虽然两种存储模型的组织结构不尽相同,但是因为内存处理效率颇高,这个问题在速度面前就显示得微不足道。放到实际环境中检验,通过追踪两个存储模型的数据处理流程,发现它们的处理效率的确没有差别,所以两种存储模型虽然结构不同,但是在CACHE状态可以完全忽略。

差异主要体现在数据块的CHUNK状态。进行CHUNK状态后,数据处理将在磁盘上执行。行存储是以行为单位,若整行读取,那么行存储效率很高;如果读取多行,最好在数据写入前将被检索的数据排列在一起,这样只需要对磁盘做一次定位和读取。同样的,列存储是以列集合为单位,它适合对单列连续数据的读取,如果读取多列数据,就需要扫描不同的磁盘位置,这会降低磁盘检索效率。

数据块CHUNK状态的写处理,只会发生删除和更新操作。因为更新被分解为删除和追加,所以实质仍然是删除操作。删除操作不会将数据从磁盘中清除,只在数据的某个位置做一个无效标记。如果是批量删除,就需要分别做多个无效标记,这种操作对磁盘性能影响很大。

但是在实际应用时不是这样。根据磁盘(温彻斯特硬盘)工作特性,一个完整的读/写处理,分为磁头定位、等待、数据传输三个阶段。从目前磁盘性能的发展趋势来看,带宽速率的提升优于磁头定位,况且现在计算机的内存容量已经足够大,缓存一些数据也绰绰有余。根据这种情况,实际的读/写处理,是将需要的数据一次性调入内存,在内存中完成处理后再输出。这种处理方式,非常有助于提高磁盘读写效率。

在其它方面,列存储模型的数据是可以压缩的,压缩的好处是能够节省磁盘和内存的空间。比如当某一列有10个999的整数时,就不必把10个999依次排列,而是在999前面加一个10,就表达了10个999的含义。如果有增加或者删除999的操作时,只需要对10这个位置的参数进行修改,而不用修改999本身。行存储模型则没有这方面的能力。另外我们在列存储模型中采用了索引合并技术,这项技术除了节省磁盘和内存空间,还省略了关联操作,简化了存储层面的数据计算。行存储模型如果使用索引,则需要用户说明具体的列,并且在行数据集合之外开辟一块索引数据空间,处理前进行关联才能生效。根据我们对许多应用数据的统计,两组数据完全相同的存储模型,它们的空间占比,列存储模型是行存储模型的28% – 53%之间。

综上所述,行/列存储模型在CACHE状态的处理性能持平。在CHUNK状态,行存储模型适合整行读取,列存储模型适合单列读取。CHUNK状态的写处理,因为数据在内存进行,它们处理性能仍然基本一致。