snowflake-cloud-data-platform - 聚类和搜索优化用例 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 仓库中,因此您需要适当地扩展您的仓库定义 [按大小扩展]。
执行速度比 MySQL 快?很可能。您的 POC 会做得很好。
成本?无法在这里进行比较。
警告:雪花只强制 NULL/NOT NULL 约束!PK 和 FK 约束可能会显示在 DDL 中,但您必须自己管理(也就是在您的应用程序中)。
推荐阅读
- solr - Grafana 不会显示 Solr 指标
- r - 将多个列表合并到 ggpot2 的数据框中
- c - 可以通过将变量标记为 volatile 来修复不安全的类型双关语吗?
- reactjs - Apollo 中具有本地状态的变量返回数据
- tcp - tcp接收数据中断
- mysql - ubuntu mysql 5.7 /var/run/mysqld/mysqld.sock?
- laravel - 如何在 Ubuntu 16.04 上使用 Apache 使用 SSL 实现 Laravel Websockets(beyondco.de 的演示项目)?
- html - 每次我单击“href”链接时,它都会再次将该链接添加到 URL。为什么?
- indexing - Microsoft T-SQL 不支持多个主键;建议的解决方法?
- c - C 在不输入密钥的情况下从 BST 中删除节点