You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snowflake JSON扁平化重复行及性能优化问题求助

Snowflake JSON扁平化优化方案

你的脚本出现性能差、大量重复行的核心问题,是错误地对非数组类型的JSON对象(obj1、obj3、obj4)使用了LATERAL FLATTEN——flatten会把对象的每个键值对拆成单独行,再和obj2的数组做笛卡尔积,多层嵌套后直接导致行数爆炸,最后靠GROUP BY ALL去重进一步拖慢性能。

优化后的SQL脚本

SELECT
    tab1.col1::VARCHAR AS col_1,
    tab1.col2::VARCHAR AS col_2,
    tab1.col3::VARCHAR AS col_3,
    -- 直接访问obj1下的字段,无需flatten
    tab1.obj1:col4::VARCHAR AS col_4,
    tab1.obj1:col5::VARCHAR AS col_5,
    tab1.obj1:col6::VARCHAR AS col_6,
    -- 仅对数组obj2做flatten展开
    sub2.value:col7::VARCHAR AS col_7,
    sub2.value:col8::VARCHAR AS col_8,
    -- 直接访问obj3下的字段,无需flatten
    tab1.obj3:col9::VARCHAR AS col_9,
    tab1.obj3:col10::VARCHAR AS col_10,
    -- 直接访问obj3嵌套的obj4字段
    tab1.obj3:obj4:col11::VARCHAR AS col_11,
    tab1.obj3:obj4:col12::VARCHAR AS col_12,
    tab1.obj3:col13::VARCHAR AS col_13
FROM
    DB.SCHEMA.TABLE_1 tab1
    -- 仅对数组类型的obj2执行lateral flatten
    LATERAL FLATTEN(input => tab1.obj2) sub2;

优化说明

  • 只对数组做flatten:obj2是唯一的数组结构,需要展开成多行;obj1、obj3、obj4都是键值对对象,直接用对象:字段名的JSON路径语法就能提取值,不需要拆分行
  • 消除笛卡尔积:去掉多余的flatten后,不会产生不必要的行膨胀,每个原始行仅对应obj2数组元素的行数(比如原始1行对应obj2的2个元素,生成2行,无重复)
  • 移除GROUP BY:没有重复行就不需要去重操作,彻底避免了GROUP BY带来的性能开销
  • 性能大幅提升:减少了中间数据量,简化了查询逻辑,执行效率会显著提高

内容的提问来源于stack exchange,提问作者Robertino Bonora

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:05:11