Snowflake 列式数据库设计,面向实时分析

2025年8月2日 | 阅读 10 分钟

什么是列式数据库?

数据库管理系统 (DBMS),将数据存储在磁盘上的列中,称为列式数据库,有时也称为面向列的数据库。这种存储方式可以更快地搜索数据分析,而数据分析通常涉及对表列进行过滤和聚合。

将列式数据库与行式 数据库 进行对比,行式数据库将一行中的所有内容一起存储在磁盘上。这些数据库设计用于事务性、单一实体查找,而不是跨多个对象的分析。对于通常扫描或聚合大量数据集但只需要少数几列的分析查询,列式数据库尤其有用。

Snowflake Columnar Database Design For Real-Time analytics

由于只需从存储中读取所需的列,因此 I/O 成本和时间得以降低,这使得它在分析应用程序中相对于传统的基于行的数据库具有优势。列式数据库为各种用例提供了更快的洞察并更好地利用系统资源。

对于数据分析,列式数据库非常出色。与行式数据库相比,它们处理的数据量更少,扫描的行数也更少。除了其数据存储能力外,列式数据库还提供了许多对时间序列数据或实时分析非常有益的特性,包括:

  • 基于概率的数据结构
  • 使用日志结构合并树 (LSMT) 可实现高写入吞吐量。
  • 增量式汇总和物化视图
  • 专为时间序列数据、分析和统计而设计的 SQL 函数

对于实时分析,请使用列式数据库。

当需要高写入吞吐量和低延迟来处理复杂、分析性查询时,列式数据库在实时分析中通常表现出色。在事件驱动架构或事件溯源技术中,通过收集长时间戳事件的历史记录来维护状态,而不是在表中执行更新或替换。

最终,这都归结为基本物理原理。列式数据库的存储方式与行式数据库不同,大多数数据库都从磁盘上保存和检索数据。当您希望轻松访问列中的数据,同时又不牺牲使事务性、行式数据库有价值的某些优势时,分析型列式数据库具有明显优势。

Snowflake Columnar Database Design For Real-Time analytics

何时最好避免使用列式数据库?

如果您希望保留事务性、标准数据库的优势,并且不打算进行复杂的分析,则应避免使用列数据库。

  • 例如,列式数据库通常不支持频繁的单行更新和删除——这是传统数据库用于在线事务处理的两个关键任务。
  • 从技术上讲,在数据集较小的情况下使用列式数据库并没有什么“错误”。
  • 但是,这些数据库的学习曲线通常较陡峭,而像 Postgres 或 MySQL 这样的关系型数据库则更易于使用且支持更广泛,并且可能能够满足您的目标。

有哪些类型的数据库是列式的?

以下是列式数据库的典型示例:

  • Amazon Snowflake 在 Redshift
  • Google BigQuery
  • ClickHouse
  • Apache Druid Apache Pinot

您可以在下方找到更多关于各种列式数据库的列表,包括专有和开源选项(以及托管或无服务器版本)。

*从技术上讲,这些被归类为“列族”数据库。为了减少读取时需要查询的列数,它们会将相关的列聚合到“族”中,而不是根据每个记录的主键按行存储数据。虽然它们不正式归类为列式数据库,但它们确实提供了一些列式数据库的优势。

哪个列式数据库最好?

答案显而易见:这取决于。您的目标、用例和财务限制都将影响您对列式数据库的决策。Amazon Redshift、BigQuery 和 Snowflake 等云数据仓库是流行、强大且通常比其他解决方案更昂贵的。它们并非针对实时分析进行了优化,但它们在 商业智能 (BI) 方面表现出色。

Snowflake Columnar Database Design For Real-Time analytics

ClickHouse、Apache Pinot 和 Apache Druid 等开源列式数据库虽然强大、灵活且(理论上)“免费”,但设置和管理可能非常耗时。如果您想利用列式存储的性能优势而不必担心基础设施,那么像 Tinybird(ClickHouse)或 DataStax(Cassandra)这样的开源列式数据库的托管版本可能是一个可行的选择。

Snowflake 数据库的结构是什么?

除了其他列中的数据之外,此结构将每列中的所有数据保存在一起。这种独特的数据布局使得检索特定列的速度更快,并实现了有效的数据压缩。

  • 列式格式:在列式数据库(如 Snowflake)中,数据是按列而不是按行存储的。这种格式对于数据分析和商业智能应用程序非常有益,因为在这些应用程序中,计算通常是在单个数据列上进行的。
  • 数据压缩更有效,并且由于相关数据保存在一起,因此可以节省存储空间,这是列式数据库的优势。
  • 快速数据检索:当查询发送到列式数据库时,只会检索和扫描所需的数据列,而不是整行。因此,数据检索速度更快。
Snowflake Columnar Database Design For Real-Time analytics
  • 为什么 Snowflake 适合包含分析的工作负载?列式存储在分析大量数据时非常有用,因为它能够进行有效的数据压缩并更快地检索特定列。
  • 有效分析:列式布局使得分析性查询能够更快地部署,因为分析性查询通常只需要访问部分数据。
  • 大数据集:列式数据库旨在有效处理大数据集。

Snowflake 的列式格式对数据检索有何影响?

Snowflake 的列式格式大大加快了数据检索速度。在运行查询时,只会访问和扫描相关的数据列,而不是整行。其结果是数据检索速度更快,这在处理大数据集时尤其有利。

  • 列访问:Snowflake 查询只需访问其所需的确切数据列,而不是遍历整行。
    Snowflake 的云架构提供了数据仓库,可存储和分析海量数据集,并具有出色的可伸缩性和速度。但是,要充分发挥其潜力,需要一个精心设计的数据模型。
  • 本文探讨了反规范化的重要性,深入研究了 Snowflake 中的数据建模领域,并阐明了 Snowflake 与传统关系型数据库管理系统 (RDBMS) 之间的主要区别。
  • 创建蓝图:Snowflake 数据建模该框架与 Snowflake 的查询引擎和分析工作负载非常匹配。
  • 规范化是一种确保数据完整性和减少数据冗余的方法。在 Snowflake 中,规范化有助于降低存储成本并简化数据管理。

Snowflake 中反规范化的重要性

反规范化是指有意在数据模型中添加冗余。复制数据似乎有悖常理,但对于某些分析需求,有意在 Snowflake 中进行反规范化可以大大提高查询速度。原因如下:

  • 减少联接操作:联接多个表是复杂查询中的常见操作。通过将来自多个维度的相关数据合并到单个事实表中,反规范化可以消除某些联接的需求。这种简化可以加快查询执行速度。
  • 提高查询性能:通过将频繁访问的数据分组到反规范化的表中,Snowflake 可以更快地检索信息。这对于经常依赖于相同属性集进行复杂分析查询的情况尤其有利。
Snowflake Columnar Database Design For Real-Time analytics

优点

  • 更高的存储成本:数据复制可能会导致存储使用量增加。由于 Snowflake 的按需付费定价结构,您将需要为存储的额外数据付费。
  • 数据完整性挑战:必须仔细引入和维护冗余,以确保重复数据项之间的一致性。这使得数据管理过程更加复杂。
  • 选择反规范化应在对查询模式和分析工作负载进行全面检查之后。
  • 如果某些查询严重依赖于组合来自多个表的数据,反规范化可能被证明是一种有价值的优化技术。

列式存储:革新性能

Snowflake 的列式存储架构是数据建模的一个主要决定因素。与传统的基于行的 RDBMS 不同,Snowflake 是按列存储数据的。这种方法可以为分析工作负载带来显著的性能提升。

  • 更快的扫描:在数据查询期间,Snowflake 只需扫描相关的列,而不是整行,即可更快地检索数据。
  • 压缩效率:由于数据类型相同,Snowflake 可以为每列实现比基于行的存储更高的压缩率。
  • 过滤效率:通过仅处理属于过滤条件一部分的列,列式存储使 Snowflake 能够更快地消除不必要的数据。
Snowflake Columnar Database Design For Real-Time analytics

列式存储与数据建模保持一致

在为 Snowflake 进行数据建模时,请考虑您的数据模型如何适应列式存储架构。

  • 聚类键:根据常用列对表中的数据进行分组。对于涉及这些列的查询,此聚类可使 Snowflake 利用列式处理优势。
  • 反规范化的影响:由于 Snowflake 高效的列式存储格式,反规范化对存储成本的影响可能不像在 RDBMS 中那样明显。从存储角度来看,复制一个列,如果数据已经与相关数据分组在一起,可能浪费更少。

RDBMS 与 Snowflake:数据建模差异

Snowflake 的列式存储架构与传统的基于行的 RDBMS 不同。这种区别会影响数据建模。

  • 通过根据查询中最常使用的列来组织数据,聚类键可以显著提高 Snowflake 的性能。
  • 反规范化的影响:由于 Snowflake 高效的列式存储格式,反规范化对存储成本的影响可能不像在 RDBMS 中那样明显。

说明

RDBMS 方法优先考虑数据完整性,要求规范化。虽然这消除了冗余,但如果复杂查询需要连接 Orders 和 Customers 表,可能会影响性能。

通过将部分客户数据反规范化到 Sales 数据库,Snowflake 方法会故意添加冗余。对于一些按客户和日期(使用聚类键)检查销售数据的查询,这使得 Snowflake 能够利用其列式存储并避免联接。

Snowflake Columnar Database Design For Real-Time analytics

尽管这是一个简单的例子,但它说明了主要区别:

  • 规范化与反规范化:虽然 Snowflake 可以从策略性反规范化中获得性能优势,但 RDBMS 更侧重于规范化。
  • 聚类键:数据根据常用的查询模式进行分组,这有助于 Snowflake 的列式存储。
Snowflake Columnar Database Design For Real-Time analytics

列数据库是一种 数据库管理系统 (DBMS),它以列格式存储和排列数据,而不是像关系型数据库那样采用传统的面向行的格式。根据行,数据被加载到列中并存储在列数据库中。

使用列存储格式有许多优点,例如:

压缩:列数据库可以比行式数据库获得更高的压缩率。由于数据类型和值相似,列存储通常在列内显示出更高的数据冗余,从而可以实现更有效的压缩算法。

  • 性能:对于需要访问特定列或对大型数据集执行聚合操作的分析任务,列式格式非常理想。由于只需要查询列,因此列可以更快、更有效地执行查询,从而提高查询速度。
  • 谓词下推:列数据库可以通过将过滤器或谓词直接推送到相关列中,来减少需要检索和处理的数据量。
  • 数据聚合和压缩使列格式更容易,同时也便于使用字典编码和游程长度编码等压缩技术。
Snowflake Columnar Database Design For Real-Time analytics

这些调整可以进一步降低存储需求并提高查询性能。在分析和数据仓库环境中,列式数据库通常被用于这些环境,其中重点是处理复杂查询、聚合和分析大型数据集。它们在数据量大且读密集型工作负载的情况下尤其有效。Google BigQuery、Apache Parquet、Apache ORC 和 Snowflake 是一些列式数据库的示例。

Snowflake 是一款基于云的列式数据库,专为高性能分析而设计。它采用分离计算、存储和服务的分离混合架构,以优化可伸缩性、并发性和效率。

1. Snowflake 的列式存储

Snowflake 以列式格式存储数据,这意味着:

  • 数据是按列而不是按行存储的。
  • 由于一列中的数据格式相似,因此压缩效率很高。
  • 查询性能得到改善,因为只扫描必要的列。
  • 内部,每个表都分为不可变的、自动优化的微分区。
Snowflake Columnar Database Design For Real-Time analytics

2. Snowflake 的架构

Snowflake 具有多集群共享数据架构,其中:

  • 存储层:以优化后的微分区形式存储在云存储(S3Azure BlobGoogle Cloud Storage)中的列式数据。
  • 虚拟仓库或计算层:由动态扩展或缩减的独立集群处理查询。
  • 服务层:管理安全性、优化、元数据和身份验证。

3. Snowflake 列式设计的最佳实践

为了最大化成本和性能:

  • 利用适当的聚类:默认的自动聚类很有效,但对于大型表,请定义聚类键以最大化列式读取。
  • 减少数据扫描:使用过滤器和修剪(自动分区消除)来避免扫描不必要的数据。
  • 使用物化视图:预先计算常用查询的结果。
  • 优化数据类型:使用最小的适当数据类型以提高存储效率。

4. 针对列式存储优化 Snowflake 查询

  1. 数据聚类与修剪
    • Snowflake 会自动扫描相关微分区以修剪数据。
    • 设置聚类键可以更有效地组织非常大的表的列式数据。
  2. 查询结果缓存
    • Snowflake 会将查询结果缓存一整天,以避免不必要的计算。
    • 元数据缓存通过跟踪分区的状态来帮助优化列式读取。
  3. 物化视图
    • 预先计算昂贵的查询以获得更快的結果。
    • 自动更新并以列式方式存储。
    • 数据类型与列选择
    • 仅查询适当的列,以最大程度地减少不必要的扫描。

在行式数据库中,数据以行的形式保存和检索,其中行的所有属性(列)都一起存储。这是传统关系型数据库(如 MySQLOracle)中的常见数据架构。另一方面,列式数据库独立存储每一列,并将给定属性的所有值存储在一起。这意味着单个列的值会顺序存储在内存或磁盘上。

结论

Snowflake 凭借其列式存储设计,成为现代数据仓库和分析的强大、可伸缩且价格合理的解决方案。通过按列存储数据,Snowflake 优化了并行处理、查询性能和压缩。

借助 Snowflake 的分离式存储和计算方法,企业可以按需扩展,从而在无需手动调整的情况下确保经济高效的性能。聚类键、结果缓存和自动数据修剪等功能进一步提高了效率。


下一主题