趋近智
传统数据仓库常依赖于工程师明确定义的静态分区方案。这通常包括按日期或区域划分大型事实表,以减少查询时扫描的数据量。这种方法虽然有效,但带来了局限性。如果查询模式改变,需要按不同维度筛选,静态分区结构就会失效。现代MPP平台,如Snowflake和BigQuery,通过自动微分区和对元数据服务的很大程度的依赖来处理这个问题。
在现代云数据仓库中,数据不是以大型、整体的文件形式存储的。相反,系统自动将加载的数据划分为连续的存储单元,称为微分区。与可能表示文件目录的传统分区不同,微分区是存储在底层块存储(如AWS S3、Google Cloud Storage或Azure Blob Storage)中的独立文件对象。
每个微分区通常包含50 MB到500 MB的未压缩数据。这个大小最适合网络吞吐量,并让查询引擎只下载表的特定部分,而不是读取整个数据集。
微分区的重要特点包括:
SELECT子句所需的列。MPP系统的性能表现很大程度上受其忽略数据能力的影响。这个过程被称为分区剪枝。系统实现这一点不是通过查看数据文件,而是通过查询独立的元数据层。
当数据写入微分区时,系统自动收集每列的统计信息,并将其存储到全局元数据服务中。常见指标包括:
当查询到达时,优化器会检查WHERE子句。它将查询谓词与元数据摘要进行比较。如果谓词中的值范围与微分区的最小/最大范围没有交集,则该分区会被完全跳过。
考虑一个基于时间戳的筛选查询:
优化器扫描元数据。如果某个微分区的最大event_ts是'2023-09-30',引擎就能确定该文件中没有匹配的行。它会生成一个文件扫描列表,将该分区排除在外。
这个过程显著减少了I/O操作。剪枝效率可以用所选分区 与总分区 的比率来表示:
随着 趋近于1,查询会变得更快、成本更低。
元数据服务扮演守门员的角色。它根据统计信息头部评估查询谓词,以决定需要获取哪些存储对象,防止不必要的I/O操作。
元数据剪枝仅在数据良好排序时才有效。如果表是随机排序的,每个微分区的最小/最大范围很可能覆盖整个数据范围。在这种情况下,元数据检查会对每个分区都返回肯定结果,从而强制进行全表扫描。
聚类是指基于一个或多个列(聚类键)对数据进行物理排序。
timestamp列将自然排序。按时间筛选的查询将能高效剪枝。user_id或transaction_id)筛选的查询,可能需要明确地重新排序数据。当数据有效聚类时,微分区的值范围是独立且窄的。当数据未聚类时,这些范围会显著重叠。
下面的图表展示了排序对分区重叠的影响。在未聚类情况下,查询值“50”可能会匹配几乎所有分区的范围。在聚类情况下,它会针对一个特定的子集。
值重叠的比较。未聚类分区(红色)具有覆盖整个范围的宽泛的最小-最大值区间。已聚类分区(青色)具有狭窄、顺序的范围,这让查询引擎可以从扫描计划中排除文件。
为了评估表布局的状况,平台提供系统函数来计算聚类深度。深度代表了特定值平均重叠的微分区数量。
如果查询筛选WHERE ID = 500且聚类深度为1,系统将精确读取一个分区。如果深度为1000,它将读取1000个分区来找到相同的ID。
保持完美聚类成本很高。每次重新聚类表时,系统都必须重写微分区(请记住,它们是不可变的)。这会产生计算成本。您必须权衡后台重新聚类的成本与查询期间获得的计算节省。
由于微分区是带有各自头部和压缩字典的独立单元,现代MPP系统可以比传统系统更灵活地处理模式演变。
当您向表中添加列时,系统无需重写现有历史数据。它只需更新元数据来注册新列。旧的微分区保持不变。当查询从旧分区请求新列时,引擎会在运行时注入NULL值。模式更改后创建的新微分区将包含该列的物理数据。
这种逻辑模式与物理存储的分离使得非阻塞DDL操作成为可能,这是数据管道中持续集成的一个重要功能。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造