Snowflake是否支持索引?

Kou*_*nda 0 snowflake-cloud-data-platform

在Snowflake文档中,我找不到使用索引的引用。

Snowflake是否支持索引,如果不支持,在使用Snowflake时性能调整的替代方法是什么?

Jon*_*tte 18

雪花不使用索引。这是使 Snowflake 能够很好地扩展任意查询的原因之一。相反,Snowflake 计算有关您加载的文件中的列和记录的统计信息,并使用这些统计信息来确定实际加载哪些表/记录的哪些部分来执行查询。它还使用列式存储文件格式,使其仅读取包含您实际使用的字段(列)的表部分,从而减少您在查询中不使用的列的 I/O。

Snowflake 将大表(千兆字节、太字节或更大)切成较小的“微分区”。对于每个微分区,它收集有关每列包含的值范围的统计信息。然后,它只加载包含查询所需范围内的值的微分区。例如,假设您有一列时间戳。如果您的查询要求 6 月 1 日到 7 月 1 日之间的数据,则根据微分区文件中存储的日期统计信息,不包含此范围内任何数据的分区将不会被加载或处理。

索引通常用于在线事务处理,因为它们在您处理一条或几条记录时可以加速工作流,但是当您对大型数据集运行分析查询时,您几乎总是在连接和聚合中使用每个表的大型子集。存储机制具有自动统计功能,可自动加速此类大型查询,无需您指定索引或调整任何类型的参数。

  • 我知道的每个数据库都会收集和使用统计数据。 (4认同)
  • 假设您有一个包含 2 个索引的表,其中一个针对一种类型的访问进行了优化,例如选择 A 列,另一个针对 B 列进行了优化。这是可能的,因为索引的物理存储就是为了执行此操作。还有微分区 - 神奇地为数据访问的每种方式做所有事情?你知道,当一切都是优势时,即使是不存在的功能,也无助于我了解产品的真正用途。 (4认同)
  • 是的,确实如此——雪花只是将其发挥到了极致,与使用索引+统计信息的常规数据库相比,它们使用所有统计信息获得了更好的吞吐量(从而获得了分析查询性能)。 (3认同)
  • 我不明白这种担忧。索引具有显着的存储和更新成本,但它们非常适合在线系统中的点查询。点查询在 Snowflake 中并不是那么好——它们并不坏,但它们不是最优化的情况。如果你想做低延迟的点查询,Snowflake 会比 MySQL 或 DB/2 差得多。但仍然比 Hive/Hadoop 好得多。 (3认同)
  • 所以,它没有索引......它是一个索引。知道了。 (3认同)
  • 对于分析来说,他们的点查询很好!我的观点更多的是“Snowflake 目前不会与典型的在线事务处理数据库竞争”。即使您已经启动了一个仓库,查询的启动成本也有点高,这既是因为编译器的工作方式,也是因为静态数据位于 S3 中,而 S3 有自己的访问成本。 (2认同)

小智 6

No Snowflake 没有索引。它的性能提升是通过消除不必要的扫描来实现的,它实现了我在每个微分区中维护丰富的元数据。例如,如果您的查询中有一个时间过滤器,并且您的表或多或少是按时间排序的,那么 Snowflake 可以“修剪”表中与查询无关的部分。

话虽如此,Snowflake 不断发布新功能,其中一项功能是其搜索优化服务,它允许您对启用的选定列执行“大海捞针”查询。不是您可以创建的索引,而是可能在幕后使用的类似索引。


Ric*_*ane 5

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/

希望这可以帮助...丰富


ynu*_*nux 5

不,Snowflake 不支持索引。并且不要让他们告诉您这是一个优势。性能调整可以如上所述进行,但通常是用金钱来完成的:支付更大的仓库费用。


小智 5

是的,Snowflake 确实支持索引。它只是不称它们为索引。

您可以同时使用:

  • 聚集索引——它们被称为聚集
  • 非聚集索引 - 它们称为搜索优化(仅限企业版)