【问题标题】:SnowFlake's performance on group by vs partition on vs distinctSnowFlake 在 group by vs partition on vs distinct 上的表现
【发布时间】:2020-09-12 22:49:25
【问题描述】:

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

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

我有三种方法:

方法一:

SELECT obj_key 
FROM my_table
WHERE some_condition
GROUP BY obj_key;

方法二:

SELECT distinct(obj_key) 
FROM my_table
WHERE some_condition;

方法3:

SELECT obj_key
FROM my_table
WHERE some_condition
QUALIFY ROW_NUMBER() OVER (PARTITION BY obj_key ORDER BY obj_key) = 1;

所以基本上我的问题归结为以下几点:

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

由于PARTITION BY 也需要ORDER BY,它不会大幅降低性能吗?

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

【问题讨论】:

    标签: database group-by distinct snowflake-cloud-data-platform partition-by


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 是的,我一直在使用查询配置文件,并运行不同的查询。但是,我看到group by 的运行时间与partition over 的运行时间相似,这就是我问这个问题的原因。我还尝试创建一个row number() over partition 作为新列RN,然后只获取那些带有RN=1 的行。令我最惊讶的是,这也有类似的表现。
    猜你喜欢
    • 1970-01-01
    • 2019-01-27
    • 2012-09-04
    • 2020-01-03
    • 2012-12-24
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 2012-05-25
    相关资源
    最近更新 更多