查询大表时的雪花性能问题

时间:2019-11-05 12:47:55

标签: snowflake-data-warehouse snowflake-schema

我正在尝试查询一个包含1Tb数据的表,该数据由Date和Company组成。一个简单的查询会花费很长时间

发布查询和查询配置文件

SELECT
    sl.customer_code,
    qt_product_category_l3_sid,
    qt_product_brand_sid,
    sl.partner_code,
    sl.transaction_id,
    dollars_spent,
    units,
    user_pii_sid,
    promo_flag,
    media_flag
FROM 
    cdw_dwh.public.qi_sg_promo_media_sales_lines_fact sl
WHERE  
    transaction_date_id >= (to_char(current_date - (52*7) , 'yyyymmdd')  ) 
    AND sl.partner_code IN ('All Retailers')
    AND qt_product_category_l3_sid IN (SELECT DISTINCT qt_product_category_l3_sid 
                                       FROM cdw_dwh.PUBLIC.qi_sg_prompt_category_major_brand 
                                       WHERE qt_product_category_l1_sid IN (246))
                                         AND qt_product_brand_sid IN (SELECT qt_product_brand_sid 
                                                                      FROM cdw_dwh.PUBLIC.qi_sg_prompt_category_major_brand 
                                                                      WHERE qt_product_major_brand_sid IN (246903, 430138))

enter image description here

5 个答案:

答案 0 :(得分:1)

显然,性能是Snowflake研发的重点领域。在努力使复杂的查询在大数据上执行之后,我们使用Exasol进行了100倍的改进,没有任何调整。

答案 1 :(得分:0)

“简单查询”我不确定是否有这样的事情。当然是天真的查询。

select * from really_large_table where column1 = value;

如果仅关心1或2列,

的性能将非常差。由于雪花必须加载所有数据。您将通过使用

来提高列数据与行数据的比率

select column1, column2 from really_large_table where column1 = value;

现在仅需要从数据存储中读取两列数据。

也许您正在寻找值为> 100的数据,因为您认为这不应该发生。然后

select column1, column2 from really_large_table where column1 > 100 limit 1;

性能将比

好得多

select column1, column2 from really_large_table order by column1 desc limit 50;

但是,如果您正在做的是最小的工作就是能够得到正确的答案,那么您的下一个选择就是增加仓库的大小。对于IO绑定工作,哪个可以带来标量改善,但某些聚合步骤却无法线性地扩展。

要注意的另一件事是,有时您的计算会产生过多的中间状态,并且它“外部溢出”(确切的措词不正确),就像耗尽ram并交换磁盘一样。

然后我们发现在JavaScript UDF中进行过多工作时会出现内存压力,这会减慢速度。

但是,其中大多数可以通过查看查询配置文件和热点来发现。

答案 2 :(得分:0)

99%的时间都花在扫描桌子上。查询中的过滤器与您的聚类键不匹配,因此不会有太大帮助。根据您在此表上拥有的历史数据量以及是否继续读取一年的数据量,可能最好通过qt_product_brand_sid或qt_product_category_l3_sid进行聚类(或创建物化视图),具体取决于哪一个更快地过滤数据。

答案 3 :(得分:0)

大的变化需要将交易日期的数据结构更改为与varchar相对的真实日期字段。

第二个您有一个带有单个值的IN子句。使用=代替。 但是对于其他IN子句,我建议重新编写查询以将那些子查询作为CTE分开,然后仅加入这些CTE。

答案 4 :(得分:0)

使用此查询:

    SELECT
        sl.customer_code,
        s1.qt_product_category_l3_sid,
        s1.qt_product_brand_sid,
        sl.partner_code,
        sl.transaction_id,
        s1.dollars_spent,
        s1.units,
        s1.user_pii_sid,
        s1.promo_flag,
        s1.media_flag
    FROM 
        cdw_dwh.public.qi_sg_promo_media_sales_lines_fact sl,
        cdw_dwh.PUBLIC.qi_sg_prompt_category_major_brand prod_cat,
        cdw_dwh.PUBLIC.qi_sg_prompt_category_major_brand prod_brand
    WHERE  
        s1.transaction_date_id >= (to_char(current_date - (52*7) , 'yyyymmdd')  ) 
        AND sl.partner_code IN ('All Retailers')
        AND s1.qt_product_category_l3_sid =prod_cat.qt_product_category_l3_sid 
        AND prod_cat.qt_product_category_l1_sid =246
        AND prod_cat.qt_product_brand_sid=prod_brand.qt_product_brand_sid 
        AND prod_brand.qt_product_major_brand_sid IN (246903, 430138)