Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Snowflake cloud data platform 通过自定义分区器在snowflake中对大型表进行分区_Snowflake Cloud Data Platform - Fatal编程技术网

Snowflake cloud data platform 通过自定义分区器在snowflake中对大型表进行分区

Snowflake cloud data platform 通过自定义分区器在snowflake中对大型表进行分区,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我们有一个很大的雪花表,有超过550亿条记录。用户通过提供年份和序列号作为谓词从该表检索数据。检索记录需要很多时间。我们不想启用自动群集,因为这对我们来说成本越来越高。因此,我们提出了以下方法。我想就这一方法听取意见 我们正在将表划分为多个分区。例如,如果表名为table_XYZ。我们每年都在创建物理表格,如2016年表格、2017年表格、2018年表格、2019年表格、2020年表格。最近的年份表是经常更改的,其他年份表基本上没有更改。我们已经编写了一个分区器/拆分器,它读取一个源相似表,并按

我们有一个很大的雪花表,有超过550亿条记录。用户通过提供年份和序列号作为谓词从该表检索数据。检索记录需要很多时间。我们不想启用自动群集,因为这对我们来说成本越来越高。因此,我们提出了以下方法。我想就这一方法听取意见

我们正在将表划分为多个分区。例如,如果表名为table_XYZ。我们每年都在创建物理表格,如2016年表格、2017年表格、2018年表格、2019年表格、2020年表格。最近的年份表是经常更改的,其他年份表基本上没有更改。我们已经编写了一个分区器/拆分器,它读取一个源相似表,并按年份拆分记录,并按年份和序列号将它们加载到相应的年份表中。我们还在所有这些表的顶部创建了一个视图。这个想法是,需要所有年份的人会反对观点,对某一年感兴趣的人会反对物理年表。我们希望这将减少检索数据的时间。然而,如果有新的一年(比如2021年),我们将不得不创建该表并重新定义视图。我一直无法找到创建动态视图的方法

请让我知道这种方法是否有任何循环漏洞


谢谢

有一种更简单的方法可以使用集群密钥获得令人难以置信的性能。请参阅此处的文档:

总之,在(年份、序列号)上创建一个群集键,在后台,Snowflake将根据这些键自动重新对数据进行群集(排序)。最初,这可能会对整个表重新排序,但随后,它只会对新添加的值重新排序

我在一个十亿行的表上做了一个测试,我创建了一个唯一的序列,并在其上放置了一个集群键,通过该键执行随机查找,每个获取在毫秒内返回,只有一个I/O

Snowflake在美国还有一个客户,在一个表中有超过PB的数据(是的,1000 TB),该表使用相同的技术对最近添加的数据实现出色的查询性能

为了帮助调整性能,我建议(如果可能的话)在数据以年份格式到达时加载数据。也就是说,如果你要做几年的批量装载,一次装载一年。否则别担心

然后,您可以删除物理分区和视图,让Snowflake保持整个解决方案干净并自动更新


您会发现后台集群在对数据进行排序时会有一个初始成本,但随后会有一点成本,而且性能的提高是值得的。

我认为任何数据库都不会提供针对不存在的表的视图;)您可以做的是:

(最简单):创建10或20个空的“未来”表,并将它们添加到视图中。它们将是空的,因此不会影响性能


(更难):创建一个将在年底某处运行的作业,并创建新的年度表并重新创建视图

如果加载到表中的历史记录不变,则在第一次重新聚集时,重新聚集表的成本将是最高的。随着时间的推移,它应该会变得更便宜,对吗


如果出于某种原因不想使用自动重新集群,为什么不做现在正在做的事情,而是将其放在一个表中?运行一系列select查询,按
年份
序列号
排序,然后插入到新表中。对我来说,将其拆分为多个表是没有意义的。

我相信,“内置”微分区和集群键也会做同样的事情。在日期列上创建clutster键后,扫描将删除以前的日期,直到以前的日期没有DML为止。此外,自动刷新也将只适用于较新的日期。谢谢,我喜欢这种方法。我正试图从节目中做到这一点。这种方法将节省一些处理时间。Hi John,我们确实评估了这个选项,但对于我们的用例来说,这是一件昂贵的事情。我们可能仍然会选择自动重新聚类,但这只适用于最近一年的表,因为旧年份数据几乎不会改变。如果您的数据已经“自然聚类”,则重新聚类将不需要任何成本,因为数据已经聚类。关于成本问题。估计替代解决方案的时间和费用。你可能会发现,对数据进行聚类所需的人力成本远远超过了计算成本。如果我在单个表上进行聚类,那么在最近一年插入新数据时,聚类会再次失败,对吗?