【发布时间】:2020-02-17 21:03:34
【问题描述】:
在 Snowflake 文档中,我找不到使用索引的参考。
Snowflake 是否支持索引,如果不支持,使用 Snowflake 时还有什么替代的性能调优方法?
【问题讨论】:
标签: snowflake-cloud-data-platform
在 Snowflake 文档中,我找不到使用索引的参考。
Snowflake 是否支持索引,如果不支持,使用 Snowflake 时还有什么替代的性能调优方法?
【问题讨论】:
标签: snowflake-cloud-data-platform
Snowflake 不使用索引。这是使 Snowflake 能够很好地扩展任意查询的原因之一。相反,Snowflake 计算有关您加载的文件中的列和记录的统计信息,并使用这些统计信息来确定实际加载哪些表/记录的哪些部分来执行查询。它还使用列式存储文件格式,使其仅读取包含您实际使用的字段(列)的表部分,从而减少查询中不使用的列的 I/O。
Snowflake 将大表(千兆字节、太字节或更大)切成更小的“微分区”。对于每个微分区,它收集有关每列包含的值范围的统计信息。然后,它只加载包含查询所需范围内的值的微分区。例如,假设您有一列时间戳。如果您的查询要求提供 6 月 1 日至 7 月 1 日之间的数据,则不会根据微分区文件中存储的日期统计信息加载或处理不包含此范围内任何数据的分区。
索引通常用于在线事务处理,因为当您处理一条或几条记录时它们会加速工作流程,但是当您对大型数据集运行分析查询时,您几乎总是会处理连接中每个表的大型子集,并且聚合体。存储机制,自动统计,自动加速如此大的查询,无需您指定索引或调整任何类型的参数。
【讨论】:
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/
希望这有帮助...丰富
【讨论】:
No Snowflake 没有索引。它的性能提升是通过消除不必要的扫描来实现的,它实现了我在每个微分区中维护丰富的元数据。例如,如果您的查询中有一个时间过滤器,并且您的表或多或少按时间排序,那么 Snowflake 可以“修剪”掉与查询无关的表部分。
话虽如此,Snowflake 还在不断发布新功能,其中一个功能是它的Search Optimisation Service,它允许您对您启用的选定列执行“大海捞针”查询。您可以创建的索引并不完全,但可能在幕后使用类似的东西。
【讨论】:
不,Snowflake 不支持索引。不要让他们告诉你这是一个优势。 性能调整可以如上所述完成,但通常是用钱来完成的:为更大的仓库买单。
【讨论】:
Snowflake 不支持索引,它将数据保存在微分区中,或者在另一种意义上,它将数据集分解为小文件并将行格式化为列并压缩它们。服务层中的雪花元数据管理器将拥有有关每个微分区的所有信息,例如哪个分区有哪些数据。 每个分区都会在标头中包含有关自身的信息,例如最大值、最小值、基数等。与传统数据库相比,这比索引要好得多。
【讨论】: