Snowflake cloud data platform 雪花中的Listag Func性能

Snowflake cloud data platform 雪花中的Listag Func性能,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,运行在Snowflake中的SQL下面 select I_CLASS_ID,LISTAGG(I_CLASS,',') OVER(PARTITION BY I_CLASS_ID) FROM "SNOWFLAKE_SAMPLE_DATA"."TPCDS_SF100TCL"."ITEM" WHERE I_CLASS_ID IS NOT NULL 使用XSmall仓库运行SQL 查询耗时超过40分钟,仍在运行,必须中止。这张桌子相当小,所

运行在Snowflake中的SQL下面

select I_CLASS_ID,LISTAGG(I_CLASS,',') OVER(PARTITION BY I_CLASS_ID) 
FROM "SNOWFLAKE_SAMPLE_DATA"."TPCDS_SF100TCL"."ITEM" 
WHERE I_CLASS_ID IS NOT NULL
使用XSmall仓库运行SQL

查询耗时超过40分钟,仍在运行,必须中止。这张桌子相当小,所以要试着理解为什么要花这么长时间。概要文件指出,四分之一的节点执行大部分工作。有什么原因吗

select LISTAGG(I_CLASS,',') OVER(PARTITION BY I_CLASS_ID) 
FROM "SNOWFLAKE_SAMPLE_DATA"."TPCDS_SF100TCL"."ITEM" 
WHERE I_CLASS_ID IS NOT NULL

上面的一个在瞬间运行。

第一个对每一行进行聚合,因此如果您有100万行,您将得到100万行,以及所有ID

第二个while应该给出相同的结果,opitmizer可能会告诉它可以运行以下SQL:

SELECT A.I_CLASS_ID
    B.LIST
FROM FROM "SNOWFLAKE_SAMPLE_DATA"."TPCDS_SF100TCL"."ITEM" AS A
JOIN (
    SELECT I_CLASS_ID, 
        LISTAGG(I_CLASS,',') AS list
    FROM "SNOWFLAKE_SAMPLE_DATA"."TPCDS_SF100TCL"."ITEM" 
    WHERE I_CLASS_ID IS NOT NULL
    GROUP BY 1
) AS B
    ON A.I_CLASS_ID = B.I_CLASS_ID;
它将返回一百万行,但速度会非常快


我怀疑您真正想要的只是内部部分。

您没有说明2的查询计划是什么,但我怀疑它是否能立即运行。 它尝试了您的两个查询,并在2分钟后将其删除。 然后我跑: 选择I_类ID、LISTAGGI_类、、“按I_类ID超额分配” 来自雪花\u示例\u DATA.TPCDS\u SF100TCL.ITEM 其中I_CLASS_ID为空; 不到1秒

然后我跑:

select i_class_id,avg(length(i_class)),max(length(i_class)) from item group by 1;
其次是:

select i_class_id,count(i_class)*8 from item where i_class_id is not null group by 1;
您正在创建非常大的ListAgg,大小从125 KB到625 KB不等。 建议您尝试更大的DW尺寸。另外,请确保长时间运行的查询不是由于排队造成的