Snowflake cloud data platform 雪花查询性能调整
我有一个带有多个CTE的雪花查询,并使用Talend作业插入到表中。执行查询需要90分钟以上的时间。它是多个级联CTE,一个调用另一个,另一个调用另一个 我想提高查询的性能。这就像是1000行代码,我不能粘贴在这里。当我检查配置文件时,它显示了所有窗口函数和聚合函数,这会减慢查询速度 例如,最上面的是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
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了解如何通过后续与其他表的连接进行优化。它们也更容易进行故障排除
TO\u NUMBER(s.起始日期)代码> 和IFF(s.ENDDATE为NULL,'29991231',S.结束日期)代码>
标识
,序列
,或填充一个整型
列,您可以将该新列命名为sortkey。整型排序比在同一列上运行函数快得多DATETIME
然后按它排序将临时表table1创建或替换为select*from dual;
之后,您将参考table1而不是代码,而不是CTEcreate Materialized view mymv as select col1,col2 from mytable;
在计算完这个行号之后,您是如何使用它的?尽量避免在分区、ORDER BY、JOIN、WHERE等中动态地转换值。从消除LOWER()开始.Elliott,行号用于后续CTE,并使行号=1用于再次过滤掉所有CTE,谢谢你的建议。这非常有用。我是snowflake的新手,所以你能告诉我如何将CTE转换为临时表和物化视图吗。@selva不客气。我添加了两个注释,并提供了更多信息。