我正在尝试查询一个包含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))
答案 0 :(得分:1)
显然,性能是Snowflake研发的重点领域。在努力使复杂的查询在大数据上执行之后,我们使用Exasol进行了100倍的改进,没有任何调整。
答案 1 :(得分:0)
“简单查询”我不确定是否有这样的事情。当然是天真的查询。
select * from really_large_table where column1 = value;
的性能将非常差。由于雪花必须加载所有数据。您将通过使用
来提高列数据与行数据的比率 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)