1

我最近开始研究大查询,我知道它们是面向列的数据库,并且在这种类型的数据库中磁盘查找要快得多。

任何人都可以向我解释一下,与关系数据库相比,面向列的数据库中的磁盘查找速度如何更快。

4

2 回答 2

1

最大的区别在于数据存储在磁盘上的方式。

让我们看一个(过度)简化的例子:

假设我们有一个有 50 列的表,一些是数字(存储二进制),另一些是固定宽度的文本 - 总记录大小为 1024 字节。行数约为 1000 万,总大小约为 10GB - 我们正在使用具有 4GB RAM 的 PC。(虽然这些表通常存储在磁盘上的单独块中,但为简单起见,我们假设数据存储在一个大块中)。

现在假设我们想要对某一列中的所有值求和(整数在记录中存储为 4 个字节)。为此,我们必须每 1024 字节(我们的记录大小)读取一个整数。

可以从磁盘读取的最小数据量是一个扇区,通常为 4kB。因此,对于每个读取的扇区,我们只有 4 个值。这也意味着为了对整列求和,我们必须读取整个 10GB 文件。

另一方面,在列存储中,数据存储在单独的列中。这意味着对于我们的整数列,我们在 4096 字节扇区中有 1024 个值,而不是 4 个!(有时这些值可以进一步压缩) - 我们现在需要读取的总数据大约是 40MB 而不是 10GB,而且这些数据也将保留在磁盘缓存中以备将来使用。

如果我们查看 CPU 缓存(假设数据已经从磁盘缓存),情况会更好:每 1024 字节一个整数远非 CPU(L1)缓存的最佳值,而一个块中的 1024 个整数将显着加快计算速度(这些将在 L1 缓存中,比普通内存访问快 50 倍左右)。

于 2016-09-13T22:27:46.303 回答
0

“磁盘查找要快得多”是错误的。真正的问题是“面向列的数据库如何在磁盘上存储数据?”,答案通常是“仅通过顺序写入”(例如,它们通常不会就地更新数据),这会产生更少的磁盘寻道,因此整体速度增益。

于 2016-09-08T05:37:51.127 回答