Snowflake 是不是支持索引?
Posted
技术标签:
【中文标题】Snowflake 是不是支持索引?【英文标题】:Does Snowflake support indexes?Snowflake 是否支持索引? 【发布时间】:2020-02-17 21:03:34 【问题描述】:在 Snowflake 文档中,我找不到使用索引的参考。
Snowflake 是否支持索引,如果不支持,使用 Snowflake 时还有什么替代的性能调优方法?
【问题讨论】:
【参考方案1】:Snowflake 不使用索引。这是使 Snowflake 能够很好地扩展任意查询的原因之一。相反,Snowflake 计算有关您加载的文件中的列和记录的统计信息,并使用这些统计信息来确定实际加载哪些表/记录的哪些部分来执行查询。它还使用列式存储文件格式,使其仅读取包含您实际使用的字段(列)的表部分,从而减少查询中不使用的列的 I/O。
Snowflake 将大表(千兆字节、太字节或更大)切成更小的“微分区”。对于每个微分区,它收集有关每列包含的值范围的统计信息。然后,它只加载包含查询所需范围内的值的微分区。例如,假设您有一列时间戳。如果您的查询要求提供 6 月 1 日至 7 月 1 日之间的数据,则不会根据微分区文件中存储的日期统计信息加载或处理不包含此范围内任何数据的分区。
索引通常用于在线事务处理,因为当您处理一条或几条记录时它们会加速工作流程,但是当您对大型数据集运行分析查询时,您几乎总是会处理连接中每个表的大型子集,并且聚合体。存储机制,自动统计,自动加速如此大的查询,无需您指定索引或调整任何类型的参数。
【讨论】:
我知道的每个数据库都会收集和使用统计数据。 是的,确实如此 - 雪花只是将其发挥到极致,即使用所有统计数据获得比常规数据库使用索引 + 统计数据更好的吞吐量(以及分析查询性能)。跨度> 假设您有一个包含 2 个索引的表,一个针对一种访问类型进行了优化,例如选择 A 列,另一个针对 B 列。这是可能的,因为索引是物理存储的.和微分区——神奇地为每一种访问数据的方式做所有事情?你知道,当一切都是优势时,即使是不存在的功能,也无法帮助我理解产品的真正作用。 我不明白这个问题。索引有很大的存储和更新成本,但它们非常适合在线系统中的点查询。点查询在 Snowflake 中不是那么好——它们不是坏的,但它们不是最优化的情况。如果您想以低延迟进行点查询,Snowflake 将比 mysql 或 DB/2 差得多。但仍然比 Hive/Hadoop 好得多。 @JonWatte 在 Snowflake 中超过 1000 亿行的 TB 大小的数据集上运行点查询,它们实际上相当不错【参考方案2】: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/
希望这有帮助...丰富
【讨论】:
【参考方案3】:No Snowflake 没有索引。它的性能提升是通过消除不必要的扫描来实现的,它实现了我在每个微分区中维护丰富的元数据。例如,如果您的查询中有一个时间过滤器,并且您的表或多或少按时间排序,那么 Snowflake 可以“修剪”掉与查询无关的表部分。
话虽如此,Snowflake 还在不断发布新功能,其中一个功能是它的Search Optimisation Service,它允许您对您启用的选定列执行“大海捞针”查询。您可以创建的索引并不完全,但可能在幕后使用类似的东西。
【讨论】:
【参考方案4】:不,Snowflake 不支持索引。不要让他们告诉你这是一个优势。 性能调整可以如上所述完成,但通常是用钱来完成的:为更大的仓库买单。
【讨论】:
【参考方案5】:Snowflake 不支持索引,它将数据保存在微分区中,或者在另一种意义上,它将数据集分解为小文件并将行格式化为列并压缩它们。服务层中的雪花元数据管理器将拥有有关每个微分区的所有信息,例如哪个分区有哪些数据。 每个分区都会在标头中包含有关自身的信息,例如最大值、最小值、基数等。与传统数据库相比,这比索引要好得多。
【讨论】:
以上是关于Snowflake 是不是支持索引?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Snowflake JDBC 驱动程序支持 Snowflake EXPLAIN 查询
SQL 编译错误:无法在 Snowflake 中评估不受支持的子查询类型
是否仅支持同一 Snowflake 区域中的帐户之间的数据共享?