Snowflake 微分区

2025年8月1日 | 阅读 6 分钟

什么是微分区?

Snowflake 表会自动将所有数据分区到称为微分区的连续存储单元中。在表中,行组按列排列并映射到不同的微分区。由于其大小和结构,非常大的表(可能包含数百万甚至数亿个微分区)可以被高度细粒度地剪枝。

Snowflake 保存了每个微分区中行的所有元数据,包括

  • 每个微分区列的数字范围。
  • 唯一值的数量。
  • 额外的属性用于有效的查询处理和优化。
Snowflake Micro-Partitioning

微分区优势

使用 Snowflake 的表数据分区方法具有以下优势:

  • 与传统的静态分区不同,Snowflake 微分区是自动生成的;用户不需要提前主动创建或管理它们。
  • 顾名思义,微分区很小(压缩前为 50 到 500 MB),可以进行细粒度剪枝,从而实现更快的搜索和非常高效的 DML。
  • 由于其均匀的小尺寸和值范围重叠的能力,微分区有助于防止偏斜。
  • 列式存储是指在微分区内独立存储列。

自动聚类

剪枝查询

在查询运行时,Snowflake 维护的微分区元数据可以实现微分区中列(包括包含半结构化数据的列)的精确剪枝。例如,假设一个包含日期和小时列的大型表存储了一年的历史数据。

这种程度的剪枝使得范围内的查询(也称为“切片”)可以精细到一小时或更短,对于时间序列数据可能实现亚秒级的响应速度。

Snowflake Micro-Partitioning

并非所有谓词语句都可以进行剪枝。例如,即使子查询产生一个常量,Snowflake 也不会根据带有子查询的谓词来剪枝微分区。

什么是数据聚类?

表中的数据通常根据自然维度进行组织,例如日期和/或地理区域。由于部分或完全排序的表数据会影响查询性能,尤其是在非常大的表上,“聚类”是查询的一个重要组成部分。

Snowflake Micro-Partitioning

Snowflake 在微分区中使用的数据聚类在此图表中仅在小范围内概念性地表示。一个普通的 Snowflake 表可能包含数十个甚至数百万个微分区。

查询性能

微分区对于提高 Snowflake 的查询性能至关重要。当您运行查询时,Snowflake 可以分析该查询,并使用查询过滤器来确定哪些微分区包含相关数据。通过避免读取不相关的微分区,Snowflake 的查询优化器会大大减少查询运行时需要扫描的数据量。

自动数据优化

Snowflake 会自动对微分区应用数据压缩和优化方法。数据在进入 Snowflake 时以混合列式格式存储,从而实现高效的列级压缩。

可扩展性和并发性

得益于微分区,Snowflake 可以有效管理多个并发查询并在需要时水平扩展。Snowflake 可以通过同时处理不同的微分区来处理多个查询。Snowflake 可以通过其并行性将查询工作分配给多个计算资源,从而加快查询执行速度并最大限度地利用资源。

Snowflake Micro-Partitioning

想象一下,几个人同时在一个整理有序的房间里寻找不同的东西。如果您将任务分配给几个人,您可以更快、更有效地完成任务。与此类似,Snowflake 由于能够同时处理多个微分区,因此可以处理繁重的工作负载并水平扩展以适应不断增长的需求。

保持最佳尺寸

微分区不应过大或过小。过小的微分区可能会导致过多的元数据开销。想象一下,就像一堆小书架。处理和标记每个盒子可能效率低下且耗费资源。

通过明确定义聚类键,用户可以控制 Snowflake 如何生成微分区。

Snowflake 聚类

聚类是 Snowflake 的一种方法,通过组织和存储表中的数据来提高查询性能。它涉及将一个或多个具有相似值的列物理地组合在一起。

聚类的优势:更好的查询性能

在 Snowflake 中,聚类表意味着其内容被物理地组织起来,以将相似的值分组。这种组织方式提供了以下直接影响查询性能的优势:

  • 减少数据扫描:当您运行一个使用聚类列进行过滤或搜索的查询时,Snowflake 可以避免读取不包含相关数据的无关微分区。由于相似的值位于同一位置,它可以更有效地找到所需数据。通过减少必须检查的数据量来加快查询处理速度。
  • 增强的并发性:同时处理多个查询的能力称为并发性,聚类可以增强它。
  • 当并行运行查询时,Snowflake 可以为每个查询分配不同的微分区,从而允许它们被独立处理。
  • 这种并行性使 Snowflake 能够有效扩展并处理繁重的工作负载。
Snowflake Micro-Partitioning

减少存储空间:通过提供以下优势,聚类除了提高查询性能外,还有助于优化存储使用。

  • 更好的数据压缩:为了减少数据所需的存储空间,Snowflake 使用先进的压缩技术,包括列式压缩。当数据被聚类时,相似的值在物理上被分组在一起,从而提高了压缩技术的效率。
  • 高效的存储利用:聚类通过对相似的值进行分组来避免存储冗余或重复的数据。

Snowflake 一旦将相同的值保存在一个微分区内,而不是重复存储。这种高效的存储利用也有助于降低总存储成本。

Snowflake Micro-Partitioning

选择聚类的列

在选择要用于聚类的列时,选择经常在过滤或搜索查询中使用的列至关重要。目标是将经常一起检索的相关值分组。例如,如果您经常使用“产品”列查找销售信息,则按“产品”列对表进行分组会很有用。

在构建聚类键时,应考虑以下事项:

  • 常用过滤器:要过滤数据,请确定在查询的 WHERE 子句中最常用的列。
  • 基数:列中唯一值的数量称为基数。对于聚类,通常首选高基数列,因为它们提供了更多有效分组的机会。
  • 分布:检查选定的聚类列中的值在整个数据集中是否分布均匀。如果值高度偏斜或集中在少数类别中,聚类的优势可能会减弱。
  • 分组和填充:数据插入数据库的顺序会影响聚类的效率。当数据根据聚类列按排序顺序提供时,Snowflake 可以实现最佳聚类。为了保持所需的顺序,在加载数据时应使用 ORDER BY 子句
Snowflake Micro-Partitioning

在加载数据时,应考虑以下事项:

  • 排序加载:在将数据文件加载到 Snowflake 之前,请尝试根据聚类列进行排序。这可以通过确保数据按预期顺序物理放置来提高聚类效率。
  • 顺序加载:如果您定期将数据加载到表中,请尝试根据聚类列加载数据。顺序加载可以优化优势并保持所需的聚类顺序。例如,如果聚类列是日期,则应按从最早的日期到最新的日期加载数据。
  • 数据修改和聚类:频繁的数据更改,例如更新、插入或删除,可能会影响聚类的有效性。表内数据更改可能导致数据碎片化和聚类优势减弱。在某些情况下,可能需要定期重新聚类才能恢复到最佳性能。
Snowflake Micro-Partitioning

在处理数据修改时,应考虑以下事项:

  • 计划重新聚类:根据数据更改的速度,您可能需要计划重新聚类操作,以重新组织数据并恢复有效的聚类。
  • 检查数据修改的影响:密切关注主要数据更改对表中查询性能和聚类的影响。考虑频繁重新聚类的优势与它引起的开销之间的权衡。

注意:对于更新较少表,初始微分区将具有更长的生命周期。重新聚类可能有助于经常更新的表。

结论

总之,我们可以得出结论,聚类和微分区是两种关键的 Snowflake 功能,可显著提高可扩展性和性能。微分区是数据存储的基本单元,它提供了更好的查询性能、自动数据优化以及更高的可扩展性和并发性等优势。