【问题标题】:WITH in Snowflake/SQL: Comparison to Temporary TablesSnowflake/SQL 中的 WITH:与临时表的比较
【发布时间】:2020-09-02 00:20:39
【问题描述】:

除了编码偏好之外,是否有任何理由在 Snowflake 中使用一系列 WITH(SELECT . . . ) 语句/子句而不是创建多个临时表。是否存在性能或其他问题会导致人们偏爱一种方法而不是另一种?

【问题讨论】:

  • 一旦数据在仓库中被处理,你的性能会显着提高,因此将数据写回存储然后为每个临时表读取它可能会影响你的性能,尽管其中一些很可能会被仓库缓存抵消。因此,这可能取决于您正在做的事情的复杂性。您是否进行了测试和比较?
  • 我想补充一点,有了 WITH,您可以告知查询引擎您正在做什么,因此可以对其进行优化。而当您越过语句边界时,引擎更难进行优化。简而言之,绝大多数性能优化都是在单个语句中完成的。

标签: snowflake-cloud-data-platform with-statement


【解决方案1】:

我在这方面有一些现实世界的经验。我们在 ETL 中采用了混合方法

CTE 将结果保存在内存中,从而在处理大量数据时节省 I/O 成本。根据我们处理涉及 100 亿行的 ETL 的经验,CTE 需要 2 小时,而 table 方法需要 4.5 小时。但是我们应该谨慎选择我们的武器,CTE 不会在所有场景中都表现良好。在以下场景中,您必须在使用 CTE 之前进行一些测试

  1. 当您的 ETL 查询超过 7-8 个步骤时
  2. 查询是大表和小表的组合
  3. 数据量少,有机会重用转换逻辑

还请记住,CTE 无法利用元数据,因此连接和扫描的行计数估计将不准确,优化器将无法优化查询路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    相关资源
    最近更新 更多