雪花查询性能调整

时间:2020-02-06 18:40:21

标签: snowflake-cloud-data-platform snowflake-schema

我有一个包含多个ctes的雪花查询,并使用Talend作业插入到表中。执行查询需要超过90分钟的时间。是多个级联ctes,一个正在调用另一个,另一个正在调用另一个。

我想提高查询的性能。就像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%的时间。您能建议一种替代方法来提高查询性能吗?

1 个答案:

答案 0 :(得分:2)

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

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

  1. 使用CREATE TEMPORARY TABLE AS代替CTE。在要连接或过滤的列上创建表时,添加ORDER BY。临时表对于优化器来说更容易构建和以后使用。 ORDER BY帮助Snowflake知道在随后连接其他表时要优化的内容。它们也更易于故障排除。
  2. 在您的示例中,请查看是否可以将这些数据保留为永久列,以便Snowflake可以跳过转换部分并对其进行更好的统计:TO_NUMBER​(​S​.​STARTDATE​)IFF​(​S​.​ENDDATE IS NULL, '29991231', S​.​ENDDATE​)​
  3. 替代步骤2,而不是按照startDate和endDate进行排序,请查看是否可以添加IDENTITYSEQUENCE或填充INTEGER列(可用作排序键) 。您也可以从字面上命名此新列sortKey。排序整数比在DATETIME上运行函数然后按其排序要快得多。
  4. 如果可以将任何CTE更改为实例化视图,则它们将是预先构建的,并且速度将大大提高。
  5. 最后,在插入临时表之前,将所有数据暂存到临时表中(按与创建目标表相同的列排序)。这样可以使插入步骤本身更快,并且Snowflake可以更轻松地处理对该表的并发更改。

注意:

  1. 要创建temporary table,请执行以下操作: create or replace temporary table table1 as select * from dual;之后,您引用table1而不是代码而不是CTE。
  2. 材料化视图记录在here中。它们是企业版功能。它们的语法为:create materialized view mymv as select col1, col2 from mytable;