Snowflake 中对非常大的表进行删除操作的最佳方法是啥?

Posted

技术标签:

【中文标题】Snowflake 中对非常大的表进行删除操作的最佳方法是啥?【英文标题】:What is the best approach in Snowflake for delete operations on a really large table?Snowflake 中对非常大的表进行删除操作的最佳方法是什么? 【发布时间】:2019-10-25 14:54:04 【问题描述】:

我们正在考虑将 ODS 从 S3 迁移到 Snowflake,但对性能有些担忧。从 15 亿行(这将是较小的一侧)行表中删除 3900 万行在 x-small 仓库中需要 15 分钟,在小型仓库中需要 8 分钟,在中型仓库中需要 5 分钟。我们可以在更大的情况下投入资金,但在探索所有其他措施之前真的不想这样做。

我们也在考虑实施手动分区系统,以将表分块,但创建支持功能需要开发成本。

Snowflake 是否有一个我不知道的分区系统,它相当于 SQL Server?我知道这是一个范围,但交换分区很棒。

感谢您的任何反馈!

【问题讨论】:

费用为 0.50 学分 (XS)、0.53 学分 (s) 和 0.67 学分 (m)。在我们的例子中是 1 美元。根据您这样做的频率,我不确定这应该被视为“问题” 虽然人们提到你可以集群来排序数据,你应该命令它保存你最常做的操作,(经常读取)以避免读取所有分区,不用担心关于删除等微小的成本.. 我很惊讶 S3 在您的情况下更快或更便宜。你能告诉我们你的删除查询的执行计划吗? Snowflake 中唯一的性能旋钮仍然是集群键(如果不集群,则为排序)。 【参考方案1】:

Snowflake 没有像 SQL Server 这样的分区,但是 Snowflake 中数据的存储方式是微分区,类似……有点。您可以使用 Snowflake 的自动重新聚类服务将这些微分区对齐到一个或多个字段上,这将使删除这些键的操作更快。利用要删除的字段对表进行聚类应该会有所帮助。

【讨论】:

谢谢迈克!上面的建议就是我们所做的,集群在删除键上并启用了自动集群。我认为这些写很痛苦,但不知道如何管理这块拼图。我希望在引擎盖下,如果有意义的话,Snowflake 只会“丢弃”分区而不实际“擦除”它们。 写入性能不受定义集群键的影响。如果您使用自动集群,集群会在后台异步进行。【参考方案2】:

在表上进行显式集群的方法需要经过深思熟虑的规划,以考虑涉及同一张表的各种访问模式和工作负载(摄取、查询等)以及成本考虑,因此我不确定是否为删除案例进行显式集群更改表格布局的充分理由。 如果不是从大容量中删除,而是使用 CTAS 在幸存的行上创建另一个表并删除原始表,该怎么办?

【讨论】:

这就是 delete 正在做的事情,但仅适用于影响行的分区。

以上是关于Snowflake 中对非常大的表进行删除操作的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Snowflake 中克隆的表可以成为源吗?

在运行非常缓慢的 SQL 的非常大的表上删除查询

jquery - 从一个非常大的表中删除所有行的最快方法

如何删除文件中的重复行而不在 Unix 中对其进行排序

从大表的子集中对随机行进行最快查询 - postgresql

SQL Server 聚合非常大的表