SnowFlake在group by、partition on、distinct上的性能

gho*_*ost 5 database group-by distinct partition-by snowflake-cloud-data-platform

我在 Snowflake 有一张桌子。表中的一列称为obj_key(对象键)。表大小非常大(以 TB 为单位),因此性能要求很高。

现在,每次完成对象更新时都会向表中添加一个新条目。新插入的行在列中具有相同obj_key但不同的条目time_modified。假设我想obj_key在某些条件下获取与表不同的数据。

我有以下三种方法:

方法一:

SELECT obj_key 
FROM my_table
WHERE some_condition
GROUP BY obj_key;
Run Code Online (Sandbox Code Playgroud)

方法二:

SELECT distinct(obj_key) 
FROM my_table
WHERE some_condition;
Run Code Online (Sandbox Code Playgroud)

方法三:

SELECT obj_key
FROM my_table
WHERE some_condition
QUALIFY ROW_NUMBER() OVER (PARTITION BY obj_key ORDER BY obj_key) = 1;
Run Code Online (Sandbox Code Playgroud)

所以基本上我的问题可以归结为这些:

我读过,distinct在多个列上是由 执行的group_by(col1, col2, ..., col n)。那么两者的性能有何不同(如果有的话)?

既然PARTITION BY还需要一个ORDER BY,那么它不会大大降低性能吗?

如果有人能够提供这些查询如何在 SnowFlake 上运行的细节,我会很高兴。

Gok*_*til 2

根据 Snowflake 的基数期望,前两个查询可以使用相同的执行计划执行。

您的第三种方法将使用窗口函数运算符,并且可能需要更多时间。

由于您拥有数据集,我强烈建议您进行自己的测试,并观察执行计划和性能:

https://docs.snowflake.com/en/user-guide/ui-query-profile.html#how-to-access-query-profile

实际上,我对 SNOWFLAKE_SAMPLE_DATA 数据库做了一些测试,我可以看到前两个查询是使用相同的执行计划执行的,并且比第三个查询执行得更好。