首页 > 解决方案 > 聚类和搜索优化用例 Snowflake

问题描述

我在 MySQL aurora 中有一个表,我需要迁移到 Snowflake 。表的大小为 6 TB,有 30 亿行。对于我们的应用程序,90% 的时间我们使用基于OBJ_ID返回 100 到 1000 条记录的查询。

Snowflake 中的 DDL 类似于 MySQL

create or replace table app_event (
  ID varchar(36)  not null primary key, 
  VERSION number, 
  ACT_TYPE varchar(255),
  EVE_TYPE varchar(255),
  CLI_ID varchar(36),
  DETAILS variant,
  OBJ_TYPE varchar(255),
  DATE_TIME timestamp,
  AAPP_EVENT_TO_UTC_DT timestamp,
  GRO_ID varchar(36),
  OBJECT_NAME varchar(255),
  OBJ_ID varchar(255),
  USER_NAME varchar(255),
  USER_ID varchar(255),
  EVENT_ID varchar(255),
  FINDINGS varchar(255),
  SUMMARY variant
);

我们正在从 MySQL 迁移到 Snowflake,因为我们需要执行分析和聚合查询,而 MySQL 在这方面做得很好,因此我们正在考虑为此目的迁移到 Snowflake。

很难以如此巨大的增长来维持一个 6 TB 的 MySQL,这就是为什么我们正在考虑通过分析和聚合将一些用例扩展到 Snowflake。

所以计划是将最近 2 年的数据保存到 MySQL 中,并将完整的数据子集保存到 Snowflake 中。

我们可以这样做,但对于某些用例,我们需要导出一些报告以供需要完整数据和查询的用途使用,例如

select * from table where OBJ_ID ='1234'

现在的问题是对于 6 TB 表 30 亿行,Snowflake 对此类查询表现良好吗?1 秒 - 3 秒的延迟很好。

为了获得这种性能,我需要使用聚类搜索优化

我在 OBJ_ID 列中有按时间顺序排列的 UUID,并且该表中将有数百万个不同的 OBJ_ID。

我应该通过 OBJ_ID 创建表簇吗?

对于这种用例,我们有什么方法可以让 Snowflake 更快地工作吗?

我们可以使用散列码进行聚类并仅创建基于 NTILE 或 NTILE 的分组吗?

我们计划用 2 亿个数据做 POC,但是可以吗,还是我们需要用完整的数据集进行测试?

如果我们将雪花用于这种用例,成本会更高吗?

注意:这是一个单独的表,与任何其他表没有关系

测试一: 我们已经加载了 1.5 亿行基于 OBJ_ID 的选择,它返回 400 行需要 3 秒,当我们执行相同的查询时需要 200 毫秒。

它说分区总数 350 分区扫描 250

之后我们通过 OBJ_ID 更改表并使用集群,但结果相同。

我们不知道 CLUSTER 是否工作,但我们在这里没有获得任何性能提升

我们能让他更快吗?

标签: snowflake-cloud-data-platformsnowflake-schema

解决方案


很难回答,因为这里有多个问题,有些人可能会认为这都是固执己见。话虽这么说,是的,按键集群。查询执行的实际工作发生在 Snowflake 仓库中,因此您需要适当地扩展您的仓库定义 [按大小扩展]。

执行速度比 MySQL 快?很可能。您的 POC 会做得很好。

成本?无法在这里进行比较。

警告:雪花只强制 NULL/NOT NULL 约束!PK 和 FK 约束可能会显示在 DDL 中,但您必须自己管理(也就是在您的应用程序中)。


推荐阅读