database - SnowFlake 在 group by vs partition on vs distinct 上的表现
问题描述
我在雪花中有一张桌子。表中的一列称为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 上运行的细节,我会很高兴。
解决方案
根据 Snowflake 的基数期望,前两个查询可以使用相同的执行计划执行。
您的第三种方法将使用窗口函数运算符,并且可能需要更多时间。
由于您拥有数据集,我强烈建议您进行自己的测试,并观察执行计划和性能:
https://docs.snowflake.com/en/user-guide/ui-query-profile.html#how-to-access-query-profile
实际上,我用 SNOWFLAKE_SAMPLE_DATA 数据库做了一些测试,我可以看到前两个查询以相同的执行计划执行,并且比第三个查询执行得更好。
推荐阅读
- python - 正确的单词生成没有重复
- javascript - 如何使用 discord.js 制作问候消息
- typescript - 在 webpack 中找不到模块(开发模式)
- mongodb - mongo-go-driver 上下文包装函数
- intellij-idea - 在项目视图 Intellij 中查看文件
- telegram - 如何通过 API 将机器人添加到电报组?
- jquery - FormData 不接收任何值仅令牌
- python - 在外星人入侵游戏中,我发射子弹和加载外星人的代码在运行后不显示输出?
- python - Python 3.7.4:继承 ABC 和具体类
- c++ - Compute Power(x,y) 代码说明 C++