【发布时间】:2021-07-19 18:43:32
【问题描述】:
我在 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 秒的延迟就可以了。
要获得这种性能,我需要使用 clustering 或 search optimization
我在 OBJ_ID 列中有按时间顺序排列的 UUID,并且该表中将有数百万个不同的 OBJ_ID。
我应该通过 OBJ_ID 创建表簇吗?
有什么方法可以让 Snowflake 在这种用例中运行得更快?
我们可以使用散列码进行聚类并创建表只是一个基于或 NTILE 的分组吗?
我们计划用 2 亿个数据做 POC,但可以吗?还是我们需要用完整的数据集进行测试?
如果我们在这种用例中使用 Snowflake,成本会更高吗?
注意:这是一个单独的表,与任何其他表没有关系
测试一: 我们已经加载了 1.5 亿行 基于返回 400 行的 OBJ_ID 选择需要 3 秒,而当我们执行相同的查询时则需要 200 毫秒。
它说 分区总数 350 分区扫描 250
之后我们更改表并使用 OBJ_ID 的集群,但结果相同。
我们不知道 CLUSTER by 是否工作,但我们在这里没有获得任何性能提升
我们可以让他更快吗?
【问题讨论】:
标签: snowflake-cloud-data-platform snowflake-schema