【问题标题】:Is a SELECT DISTINCT or GROUP BY faster in snowflake?雪花中的 SELECT DISTINCT 或 GROUP BY 更快吗?
【发布时间】:2021-09-01 15:15:13
【问题描述】:

由于雪花缓存结果的方式,我无法找到查询的运行速度,但是这两个查询中的哪一个是“正确”的方法? (或者有更好的方法吗?):

select left.*, right.name from LEFT_TABLE left inner join (
  select distinct ID, NAME from RIGHT_TABLE
) right on left.id = right.id;

或:

select left.*, right.name from LEFT_TABLE left inner join (
  select any_value(ID) as ID, any_value(NAME) as NAME
  from RIGHT_TABLE
  group by ID
) right on left.id = right.id;  

LEFT_TABLE 看起来像这样:

A B ID
13.18 677.92 112
15.65 971.36 113
2.72 991.00 114
33.54 755.18 116
5.14 588.12 115

RIGHT_TABLE 看起来像这样:

PK ID NAME
251 112 John Doe
287 112 John Doe
232 112 Jane Bow
242 113 Jane Bow
234 113 Jane Bow

【问题讨论】:

  • 它们应该是相同的,但是你可以查看它们的执行计划以了解更多关于每个查询的幕后情况
  • 这两个查询做不同的事情。你应该使用你想要的版本。当然,除非您知道对于id,该名称始终是唯一的。
  • 在 RIGHT_TABLE 中相同的ID 总是对应相同的NAME
  • 既然如此,对于单个查询使用 ANY_VALUE() 会更快,但要注意它对结果集缓存的影响。 ANY_VALUE() 是一个非确定性函数,因此如果像 BI 仪表板之类的东西在表的数据更改之间定期运行查询,Snowflake 将无法使用结果集缓存并且必须再次运行查询。

标签: sql snowflake-cloud-data-platform


【解决方案1】:

您可以禁用数据和结果集缓存,然后为查询计时。

禁用结果集缓存:

ALTER SESSION SET USE_CACHED_RESULT = FALSE;

清除数据缓存:

ALTER WAREHOUSE WH_NAME SUSPEND;
ALTER WAREHOUSE WH_NAME RESUME;

【讨论】:

    【解决方案2】:

    在 Snowflake 中处理查询涉及 3 个不同的缓存:

    1. 结果集缓存:
    • 这是“全有或全无”的结果;你要么直接得到最终答案,不做任何处理,要么一无所获;这里没有“部分利益”。
    • 这是在我们架构的全局服务层中,并不特定于用于处理查询的任何单个虚拟仓库(计算)。
    • 结果会保留 24 小时,但您可以告诉查询处理器不要从该缓存中提取结果。
    1. 元数据缓存:
    • 也在全球服务层中
    • 存储微分区的统计信息;用于构建查询查询执行计划
    • 随着时间的推移最终会被其他查询“换掉”;您无法控制此缓存
    1. 数据缓存
    • 这是微分区级别的“传统”数据缓存。
    • 这是特定于用于处理查询的虚拟仓库(计算)。结果,如果虚拟仓库被挂起,缓存(通常)会丢失。也就是说,您应该知道,暂停并立即恢复可能会导致仓库永远不会真正暂停(作为一种优化),因此不会刷新缓存。

    底线:如果您计划在多次运行查询之间进行性能比较,您可能应该 (1) 禁用会话上的结果集缓存和 (2) 挂起,然后等待(可能一分钟),然后恢复查询执行之间的虚拟仓库。然后确认(在 SQL 查询历史窗口中)没有用于查询的数据缓存(在“扫描的字节数”列中以颜色编码... blue=local=cached, green=remote=uncached)。

    来源:雪花社区论坛

    【讨论】:

      猜你喜欢
      • 2010-10-09
      • 2021-02-09
      • 2022-01-22
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 2023-03-10
      • 2016-08-14
      • 1970-01-01
      相关资源
      最近更新 更多