我在雪花中有一张桌子。该表中的一列称为obj_key
(对象键)。表的大小非常大(以TB为单位),因此性能是理想的。
现在,每次对对象进行更新时,都会向表中添加一个新条目。新插入的行具有相同的obj_key
,但在time_modified
列中的条目不同。假设我想在特定条件下从表中获取不同的obj_key
。
我有三种方法:
方法1:
SELECT obj_key
FROM my_table
WHERE some_condition
GROUP BY obj_key;
方法2:
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上运行的细节,我很乐意。
根据对Snowflake的基数期望,可以使用相同的执行计划来执行前两个查询。
您的第三种方法将使用窗口函数运算符,并且可能需要更多时间。
由于您拥有数据集,我会HIGHLY建议您进行自己的测试,并观察执行计划和性能:
https://docs.snowflake.com/en/user-guide/ui-query-profile.html#how-to-access-query-profile
实际上,我对SNOWFLAKE_SAMPLE_DATA数据库进行了一些测试,我可以看到前两个查询以相同的执行计划执行,并且比第三个查询执行得更好。