Snowflake / SQL中的WITH:与临时表的比较

问题描述

除编码器首选项外,是否有任何理由在SNowflake中使用一系列WITH(SELECT。。。)语句/子句,而不创建几个临时表。是否存在性能或其他问题会导致一种方法偏爱另一种方法

解决方法

我对此有一些实际经验。我们在ETL中采用了混合方法

CTE将结果保存在内存中,因此在处理大量数据时节省了I / O成本。根据我们处理涉及100亿行的ETL的经验,CTE花了2个小时,而表格处理花了4.5个小时。但是我们应该谨慎选择武器,CTE并不能在所有情况下都表现良好。在以下情况下,您必须先进行一些测试,然后再使用CTE

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

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