我有一个包含多个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%的时间。您能建议一种替代方法来提高查询性能吗?
答案 0 :(得分:2)
问题在于,任何查询分析器都很难优化1000行。对于您和继承代码的未来团队成员来说,这也使故障排除变得更加困难。
我建议分解查询并进行以下优化:
CREATE TEMPORARY TABLE AS
代替CTE。在要连接或过滤的列上创建表时,添加ORDER BY
。临时表对于优化器来说更容易构建和以后使用。 ORDER BY
帮助Snowflake知道在随后连接其他表时要优化的内容。它们也更易于故障排除。TO_NUMBER(S.STARTDATE)
和IFF(S.ENDDATE IS NULL, '29991231', S.ENDDATE)
。IDENTITY
,SEQUENCE
或填充INTEGER
列(可用作排序键) 。您也可以从字面上命名此新列sortKey。排序整数比在DATETIME
上运行函数然后按其排序要快得多。注意:
create or replace temporary table table1 as select * from dual;
之后,您引用table1而不是代码而不是CTE。create materialized view mymv as select col1, col2 from mytable;