-1

我正在尝试查询一个表,其中包含按日期和公司聚集的 1Tb 数据。一个简单的查询需要很长时间

发布查询和查询配置文件

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))

在此处输入图像描述

4

5 回答 5

0

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

于 2019-11-07T09:40:46.693 回答
0

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

于 2020-04-12T04:47:54.103 回答
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)
于 2019-11-18T22:21:59.073 回答
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 中执行过多工作时会出现内存压力,这会减慢速度。

但其中大部分可以通过查看查询配置文件和热点来发现。

于 2019-11-05T20:04:26.793 回答
0

一个很大的变化需要将交易日期的数据结构更改为真实日期字段而不是 varchar。

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

于 2019-11-07T16:28:32.383 回答