在Snowflake文档中,我找不到使用索引的参考。
Snowflake是否支持索引?如果不支持,在使用Snowflake时,性能调整的替代方法是什么?
发布于 2019-10-22 09:08:56
Snowflake不使用索引。这是使Snowflake能够很好地处理任意查询的原因之一。相反,Snowflake计算关于您加载的文件中的列和记录的统计信息,并使用这些统计信息来确定实际加载哪些表/记录的哪些部分来执行查询。它还使用列存储文件格式,允许它只读取表中包含您实际使用的字段(列)的部分,从而减少查询中不使用的列的I/O。
Snowflake将大表( or、or或更大)分成较小的“微分区”。对于每个微分区,它收集关于每个列包含的值范围的统计信息。然后,它只加载包含查询所需范围内的值的微分区。例如,假设您有一列时间戳。如果您的查询请求6月1日到7月1日之间的数据,则不包含此范围内任何数据的分区将不会根据存储在微分区文件中的日期统计信息进行加载或处理。
索引通常用于联机事务处理,因为当您使用一条或几条记录时,索引可以加速工作流,但当您对大型数据集运行分析查询时,您几乎总是使用联接和聚合中每个表的大子集。具有自动统计功能的存储机制可以自动加速此类大型查询,而无需指定索引或调优任何类型的参数。
发布于 2019-10-22 02:33:15
Snowflake不支持索引,尽管它支持“集群”来提高I/O的性能。
我建议阅读这些链接来熟悉这一点:
https://docs.snowflake.net/manuals/user-guide/tables-clustering-keys.html
https://docs.snowflake.net/manuals/user-guide/tables-auto-reclustering.html
这里也有一篇关于这个话题的很好的博客文章:https://www.snowflake.com/blog/automatic-query-optimization-no-tuning/
希望这个helps...Rich
发布于 2020-09-24 18:50:58
没有Snowflake没有索引。它的性能提升是通过消除不必要的扫描来实现的,这实现了我在每个微分区中维护丰富的元数据。例如,如果你的查询中有一个时间过滤器,并且你的表或多或少是按时间排序的,那么Snowflake可以“修剪”掉表中与查询无关的部分。
话虽如此,Snowflake还在不断发布新特性,其中一个特性就是它的Search Optimisation Service,它允许您在您启用的选定列上执行“大海捞针”查询。不完全是您可以创建的索引,但可能会在幕后使用类似的东西。
https://stackoverflow.com/questions/58491962
复制相似问题