雪花聚类键数

Number of Snowflake Clustering Key

我有一个问题,这听起来可能很天真,我一直在研究雪花中的聚类键并试图理解它,只是想知道我们能否在雪花上指定多个聚类键 table 或它与每个 table 的主键相同吗?

每个 table 只能有一个集群键,尽管该键可以包含多个 columns/expressions

简答为否(不超过一个聚类键)和否(与主键不同)。

集群键有助于管理 table 的微分区,这反过来又通过分区修剪帮助提高查询性能。 我们可以有一个集群键和 'Add' 更多列,或者通过向其添加新列来更改它。 具体实现可以参考文档

为什么集群键不是主键 - 由于主键意味着一种,它确保了唯一性,而集群键则不是这样。 将聚类键更像是 'PARTITION KEY'.

以下 table 聚集在 ORDER_ID 中并且 order_id 中有重复的条目。

select * from CHK_CLUSNG_K;
+----+-------+------------+----------+
| ID | NAME  | CR_DT      | ORDER_ID |
|----+-------+------------+----------|
|  1 | name1 | 2022-03-28 |        1 |
|  1 | name1 | 2022-03-28 |        1 |
|  1 | name1 | 2022-03-28 |        1 |
|  1 | name1 | 2022-03-28 |        1 |
|  1 | name1 | 2022-03-28 |        2 |
+----+-------+------------+----------+
show tables like 'chk_clus%';
+-------------------------------+--------------+---------------+-------------+-------+---------+------------------+------+-------+--------------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------+
| created_on                    | name         | database_name | schema_name | kind  | comment | cluster_by       | rows | bytes | owner        | retention_time | automatic_clustering | change_tracking | search_optimization | search_optimization_progress | search_optimization_bytes | is_external |
|-------------------------------+--------------+---------------+-------------+-------+---------+------------------+------+-------+--------------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------|
| 2022-03-28 04:41:10.486 -0700 | CHK_CLUSNG_K | TEST_DB       | PUBLIC      | TABLE |         | LINEAR(order_id) |    5 |  1536 | ACCOUNTADMIN | 1              | ON                   | OFF             | OFF                 |                         NULL |                      NULL | N           |
+-------------------------------+--------------+---------------+-------------+-------+---------+------------------+------+-------+--------------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------+

正如 Nick 和 Pankaj 之前提到的,您在 table 上只能有一个集群密钥,并且密钥中 columns/expressions 的顺序对于过滤优势而言非常重要阅读。

但是,如果您的帐户使用的是企业版,您还可以在 table 上创建物化视图。实体化视图可以以不同于基本 table 顺序的方式进行聚类,以支持需要不同排序顺序的查询。实体化视图由后台服务维护,并保证提供与查询基础 table 相同的查询结果。如果 clustering-key 为您针对基础 table 的查询提供更好的查询计划,Snowflake 将使用物化视图。维护实体化视图的后台服务会产生成本,因此值得阅读与实体化视图及其应用程序相关的文档,以及专门针对集群的主题 (https://docs.snowflake.com/en/user-guide/views-materialized.html#best-practices-for-clustering-materialized-views-and-their-base-tables)

搜索优化是另一个 enterprise-edition 功能,用于加速具有特定访问属性的查询。您可以在此处阅读有关搜索优化的更多信息 (https://docs.snowflake.com/en/user-guide/search-optimization-service.html#using-the-search-optimization-service)

你可以在一个 table 上有多个 CLUSTERING: 否 table: YES,

上的 CLUSTERING KEYS 的一部分可以有多个列吗
CREATE TABLE <name> ... CLUSTER BY ( <expr1> [ , <expr2> ... ] ) 

所以你有很多 columns/expressions 就像在 ORDER BY 子句中一样。但就像 ORDER BY 子句一样,它们是按呈现的顺序完成的。

主键,是一个没有意义的概念,在Snowflake里面。

集群键需要注意的一点是,它们是软提示,而不是硬分区。也就是说,你让他们成为失败者,你的 tables 需要的流失越少,但你的修剪就越不锐利。

Fieldy 关于实体化视图的观点非常好,您不必在 SELECT 操作中为实体化视图命名就可以使用它,如果它的排序与您当前的查询一致 运行。鉴于磁盘实际上是免费的(与计算相比),这是一个相当不错的解决方案。