我熟悉使用列存储和行存储来将数据库数据持久化到磁盘。我的问题是,如果一个数据集完全在内存中,没有存储到磁盘,那么行与列的方向是否有很大的区别?
很多取决于数据集的大小,每行的内容是什么,你需要如何搜索它,是否要向数据集添加或删除项目等等。
还要考虑CPU和内存架构;你的缓存有多大,缓存行的大小是多少,你的CPU的预取器有多聪明。
对于小于8个字节的字段,列比行访问内存次数更少。
内存不是以寄存器为单位访问的,而是以缓存行为单位访问的。在大多数现代机器上,缓存行大小为64字节。
无论是否在内存中,压缩在列存储中也更容易。
并非完全如此。即使列没有按顺序存储在内存中,你仍然可以压缩/解压缩一列。但这可能会更快。
“压缩是否对内存操作有影响?”
这取决于情况。如果是内存操作,则压缩可能会降低性能,但另一方面,需要存储的数据量较小,因此您将能够将更多数据放入内存中。
“是否可能对操作进行向量化?”
只有在数据按行分组时,加载/存储到内存才可能变慢。
“当然,逐行处理结构体要容易得多。”
使用按行存储的指针很容易使用结构体,但是使用C++可以创建隐藏数据按列存储的类。这需要一些额外的工作,但一旦设置完成,就可能像按行一样容易。
此外,列存储通常用于实体-组件-系统模式(
entity-component-system),并且有一些库(如
EnTT)使得使用它非常容易。
“这两个都准确吗?还有没有其他的?鉴于此,如果在只读数据集上使用内存中的列存储与行存储相比,是否会有显著的性能提升,还是只有轻微的改进?”
再次强调,这在很大程度上取决于数据集的大小以及您想要如何访问它。如果您经常使用一行中的所有列,则首选逐行存储。如果您经常只使用一列,并且需要访问许多连续行的该列,则最好使用逐列存储。
此外,还有可能采用混合解决方案。您可以将一列单独存储,然后将所有其他列按行存储。
你如何在只读数据集中进行搜索非常重要。它是否会被排序,还是更像一个哈希表?如果是前者,您希望索引尽可能紧凑,并可能像
B-tree一样排序,就像Alex Guteniev已经提到的那样。如果它将像哈希映射一样,那么您可能需要逐行查找。