Snowflake cloud data platform 雪花查询性能调整

Snowflake cloud data platform 雪花查询性能调整,snowflake-cloud-data-platform,snowflake-schema,Snowflake Cloud Data Platform,Snowflake Schema,我有一个带有多个CTE的雪花查询,并使用Talend作业插入到表中。执行查询需要90分钟以上的时间。它是多个级联CTE,一个调用另一个,另一个调用另一个 我想提高查询的性能。这就像是1000行代码,我不能粘贴在这里。当我检查配置文件时,它显示了所有窗口函数和聚合函数,这会减慢查询速度 例如,最上面的是 ROW_NUMBER​(​​)​ OVER ​(​PARTITION BY LOWER​(​S​.​SUBSCRIPTIONID​)​ ORDER BY S

我有一个带有多个CTE的雪花查询,并使用Talend作业插入到表中。执行查询需要90分钟以上的时间。它是多个级联CTE,一个调用另一个,另一个调用另一个

我想提高查询的性能。这就像是1000行代码,我不能粘贴在这里。当我检查配置文件时,它显示了所有窗口函数和聚合函数,这会减慢查询速度

例如,最上面的是

ROW_NUMBER​(​​)​ OVER ​(​PARTITION BY LOWER​(​S​.​SUBSCRIPTIONID​)​ 
                   ORDER BY S​.​ISROWCURRENT DESC NULLS FIRST, 
                      TO_NUMBER​(​S​.​STARTDATE​)​ DESC NULLS FIRST, 
                      IFF​(​S​.​ENDDATE IS NULL, '29991231', S​.​ENDDATE​)​ DESC NULLS FIRST​)​ 

花费7.3%的时间。您能推荐一种提高查询性能的替代方法吗?

问题是,任何查询分析器都很难优化1000行。这也使您和继承代码的未来团队成员的故障排除变得更加困难

我建议分解查询并进行以下优化:

  • 使用
    创建临时表作为
    而不是CTE。在要加入或筛选的列上创建表时,添加
    orderby
    。临时表更便于优化器构建和以后使用。
    orderby
    有助于Snowflake了解如何通过后续与其他表的连接进行优化。它们也更容易进行故障排除
  • 在您的示例中,查看是否可以将此数据持久化为永久列,以便Snowflake可以跳过转换部分,并对其进行更好的统计:
    TO\u NUMBER​(​s​.​起始日期​)​ 和
    IFF​(​s​.​ENDDATE为NULL,'29991231',S​.​结束日期​)​
  • 第2步的替代方法是,不按startDate和endDate排序,而是查看是否可以添加
    标识
    序列
    ,或填充一个
    整型
    列,您可以将该新列命名为sortkey。整型排序比在同一列上运行函数快得多
    DATETIME
    然后按它排序
  • 如果可以将任何CTE更改为物化视图,则它们将是预构建的,并且速度将大大加快
  • 最后,在插入之前,将所有数据暂存到一个临时表中(按创建目标表的列排序)。这将使插入步骤本身更快,Snowflake将更容易处理对该表的并发更改
  • 注:

  • 要创建一个应用程序,请执行以下操作:
    将临时表table1创建或替换为select*from dual;
    之后,您将参考table1而不是代码,而不是CTE
  • 物化视图是有文档记录的。它们是企业版的功能。它们的语法是:
    create Materialized view mymv as select col1,col2 from mytable;

  • 在计算完这个行号之后,您是如何使用它的?尽量避免在分区、ORDER BY、JOIN、WHERE等中动态地转换值。从消除LOWER()开始.Elliott,行号用于后续CTE,并使行号=1用于再次过滤掉所有CTE,谢谢你的建议。这非常有用。我是snowflake的新手,所以你能告诉我如何将CTE转换为临时表和物化视图吗。@selva不客气。我添加了两个注释,并提供了更多信息。