SnowFlake 在 group by vs partition on vs distinct 上的表现
SnowFlake's performance on group by vs partition on vs distinct
我在 Snowflake 中有一个 table。 table 中的其中一列称为 obj_key
(对象键)。
table 大小非常大(以 TB 为单位),因此性能是理想的。
现在,每次对对象进行更新时,都会向 table 添加一个新条目。新插入的行具有相同的 obj_key
,但 time_modified
列中的条目不同。假设我想根据特定条件从 table 中获取不同的 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;
方法三:
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 的基数期望,可以使用相同的执行计划执行前两个查询。
您的第三种方法将使用 window 函数运算符,这可能需要更多时间。
因为你有数据集,我会强烈建议你做自己的测试,观察执行计划和性能:
https://docs.snowflake.com/en/user-guide/ui-query-profile.html#how-to-access-query-profile
实际上,我用 SNOWFLAKE_SAMPLE_DATA 数据库做了一些测试,我可以看到前两个查询使用相同的执行计划执行,并且比第三个查询执行得更好。
我在 Snowflake 中有一个 table。 table 中的其中一列称为 obj_key
(对象键)。
table 大小非常大(以 TB 为单位),因此性能是理想的。
现在,每次对对象进行更新时,都会向 table 添加一个新条目。新插入的行具有相同的 obj_key
,但 time_modified
列中的条目不同。假设我想根据特定条件从 table 中获取不同的 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;
方法三:
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 的基数期望,可以使用相同的执行计划执行前两个查询。
您的第三种方法将使用 window 函数运算符,这可能需要更多时间。
因为你有数据集,我会强烈建议你做自己的测试,观察执行计划和性能:
https://docs.snowflake.com/en/user-guide/ui-query-profile.html#how-to-access-query-profile
实际上,我用 SNOWFLAKE_SAMPLE_DATA 数据库做了一些测试,我可以看到前两个查询使用相同的执行计划执行,并且比第三个查询执行得更好。