KoalaMaybe Asked: 2024-05-17 09:14:53 +0800 CST2024-05-17 09:14:53 +0800 CST 2024-05-17 09:14:53 +0800 CST 列式数据库的查询速度如何更快? 772 为什么这么多人喜欢列式数据库?据我了解,人们更喜欢列式数据库,因为 CPU 能够可预测地缓存下一个值,因此查询速度更快。 database-design 3 个回答 Voted Best Answer Paul White 2024-05-17T20:16:01+08:002024-05-17T20:16:01+08:00 一般来说,数据仓库和分析工作负载首选列式数据存储有以下三个主要原因: 列存储通常比行存储压缩得更好,因为值都具有相同的数据类型并且通常具有相似的值。改进的压缩可以使内存和持久存储受益。 查询通常只从表中选择几列。不是将整行从存储器提取到内存中,而是仅加载必要的列。这进一步减少了 I/O 和内存使用。 现代 CPU 比主内存快得多。通过更好地利用相对较小但高速的片上高速缓存,以及对类似数据使用 SIMD 等矢量 CPU 指令,可以显着提高性能。用列数据填充缓存行通常比加载整行更有效,因为查询不需要许多值。 行存储是事务性工作负载的首选,其中可以通过 B 树查找快速找到少量记录。它还具有写入优势,因为可以一次写入单行,而列式存储需要单独更新多个结构,并且通常具有更高的 CPU 压缩开销。 Steve 2024-05-17T14:07:13+08:002024-05-17T14:07:13+08:00 据我了解,人们更喜欢列式数据库,因为 CPU 能够可预测地缓存下一个值,因此查询速度更快。 我对此领域的理解是,由于单列数据在存储中(即在磁盘上)是连续的,因此列式数据库对于某些访问模式来说速度更快。 我听说过的一个更高效的具体案例是,主要工作负载是聚合时间序列数据的子范围——这可能是某些类型的财务分析的典型情况。 我不了解实现或其应用领域的所有细节,但我怀疑列式数据库对于某些工作负载更快的原因并不是一个简单而决定性的原因,而是跨不同层和功能的一系列边际改进。并发负载下的数据库实现。 然而,列式数据库绝对适用于特殊应用程序,并且通常对于 OLTP 负载来说速度并不快。 J.D. 2024-05-17T12:51:14+08:002024-05-17T12:51:14+08:00 列式数据库的查询速度如何更快? 从整体上来说,它们不是。它们只是提供了一种不同的数据存储方式,如果使用得当,可以有效地满足特定的用例。如果使用得当,非列特定数据库可以以同样有效的方式使用。 为什么这么多人喜欢列式数据库? 在我十多年的职业生涯中,我很少遇到对列式数据库而不是非列式特定数据库有任何特定偏好的人。(请注意,我之所以继续使用这个术语,是因为有一些专注于行存储的数据库系统也在行存储表*之上提供列式数据存储,例如 Microsoft SQL Server。) 据我了解,人们更喜欢列式数据库,因为 CPU 能够可预测地缓存下一个值,因此查询速度更快。 我不相信这是正确的。我以前从未听说过这个,老实说我很难理解它的含义。 如果加速来自缓存,那么基于行的数据库对于查询不是同样有效吗? 当然。典型的行存储数据库系统利用内存自动缓存常用数据以提高性能。 我采访过的少数几个对列式特定数据库感兴趣的人似乎并不了解数据库如何很好地工作,并试图将他们的 OLTP 工作流程迁移到像 Snowflake 这样的东西,这是愚蠢的。我怀疑你和志同道合的人交谈过。不要误会我的意思,列式数据库没有任何明显的错误,但它们并没有神奇地比行存储数据库系统性能更高,就像 NoSQL 也不会自动更快一样。如果使用不当,无论您选择哪种类型的系统,您都会遇到麻烦。 * SQL Server 2014 及更高版本还提供列式存储作为主存储(“聚集列存储”),其中不使用底层行存储。从2016 SP1开始,所有版本都支持列存储。在此之前,需要企业版。
一般来说,数据仓库和分析工作负载首选列式数据存储有以下三个主要原因:
列存储通常比行存储压缩得更好,因为值都具有相同的数据类型并且通常具有相似的值。改进的压缩可以使内存和持久存储受益。
查询通常只从表中选择几列。不是将整行从存储器提取到内存中,而是仅加载必要的列。这进一步减少了 I/O 和内存使用。
现代 CPU 比主内存快得多。通过更好地利用相对较小但高速的片上高速缓存,以及对类似数据使用 SIMD 等矢量 CPU 指令,可以显着提高性能。用列数据填充缓存行通常比加载整行更有效,因为查询不需要许多值。
行存储是事务性工作负载的首选,其中可以通过 B 树查找快速找到少量记录。它还具有写入优势,因为可以一次写入单行,而列式存储需要单独更新多个结构,并且通常具有更高的 CPU 压缩开销。
我对此领域的理解是,由于单列数据在存储中(即在磁盘上)是连续的,因此列式数据库对于某些访问模式来说速度更快。
我听说过的一个更高效的具体案例是,主要工作负载是聚合时间序列数据的子范围——这可能是某些类型的财务分析的典型情况。
我不了解实现或其应用领域的所有细节,但我怀疑列式数据库对于某些工作负载更快的原因并不是一个简单而决定性的原因,而是跨不同层和功能的一系列边际改进。并发负载下的数据库实现。
然而,列式数据库绝对适用于特殊应用程序,并且通常对于 OLTP 负载来说速度并不快。
从整体上来说,它们不是。它们只是提供了一种不同的数据存储方式,如果使用得当,可以有效地满足特定的用例。如果使用得当,非列特定数据库可以以同样有效的方式使用。
在我十多年的职业生涯中,我很少遇到对列式数据库而不是非列式特定数据库有任何特定偏好的人。(请注意,我之所以继续使用这个术语,是因为有一些专注于行存储的数据库系统也在行存储表*之上提供列式数据存储,例如 Microsoft SQL Server。)
我不相信这是正确的。我以前从未听说过这个,老实说我很难理解它的含义。
当然。典型的行存储数据库系统利用内存自动缓存常用数据以提高性能。
我采访过的少数几个对列式特定数据库感兴趣的人似乎并不了解数据库如何很好地工作,并试图将他们的 OLTP 工作流程迁移到像 Snowflake 这样的东西,这是愚蠢的。我怀疑你和志同道合的人交谈过。不要误会我的意思,列式数据库没有任何明显的错误,但它们并没有神奇地比行存储数据库系统性能更高,就像 NoSQL 也不会自动更快一样。如果使用不当,无论您选择哪种类型的系统,您都会遇到麻烦。
* SQL Server 2014 及更高版本还提供列式存储作为主存储(“聚集列存储”),其中不使用底层行存储。从2016 SP1开始,所有版本都支持列存储。在此之前,需要企业版。