SQL中的聚合——如何加速查询

Posted

技术标签:

【中文标题】SQL中的聚合——如何加速查询【英文标题】:Aggregation in SQL - how to accelerate query 【发布时间】:2021-04-15 12:49:35 【问题描述】:

我有疑问,因为我想在查询中按月汇总所有指标,但是 加载数据的时间太长,还有另一种方法可以加速这个查询——意味着更快地返回数据?

SELECT
    to_char(date, 'YYYY-MM') AS date_format_m,
    /*  to_char(cd.date, 'YYYY-MM-DD') AS date_format_d, */
    client_id,
    sum(impressions) as impressions,
    sum(visits) as visits,
    sum(conversions) as conversions,
    sum(clicks) as clicks,
    sum(tracked_cost) as tracked_cost,
    sum(tracked_revenue) as tracked_revenue,
    sum(conversions) as conversions,
    sum(number_of_reports_queries) as report_queries,
    sum(errors_total) as errors_total,
    sum(traffic_log_requests) as traffic_log_requests,
    sum(conversions) as conversions,
    sum(campaigns_with_traffic) as campaigns_with_traffic,
    sum(flows_with_traffic) as flows_with_traffic,
    sum(paths_with_traffic) as paths_with_traffic,
    sum(landers_with_traffic) as landers_with_traffic,
    sum(offers_with_traffic) as offers_with_traffic
FROM 
    client_data
WHERE
    date BETWEEN CURRENT_DATE - INTERVAL '180' DAY AND CURRENT_DATE
    AND long_term_remaining_days > 0
GROUP BY 
    date_format_m, client_id

【问题讨论】:

Why should I "tag my RDBMS"? - 请添加标签以指定您使用的是 mysqlpostgresqlsql-serveroracle 还是 db2 - 或其他完全不同的东西。跨度> postgresql,我加了标签 “查询加载过多”是什么意思? --- 它返回什么你不想要的?列太多?行数太多?值太大?什么? 要“加速”查询,即更快地返回数据,请确保 client_data 表在 date 列上有索引。 edit您的问题并添加使用explain (analyze, buffers, format text)生成的execution plan(不是只是一个“简单”解释)为formatted text,并确保保留计划的缩进。粘贴文本,然后将``` 放在计划前一行和计划后一行。还请包括所有索引的完整 create index 语句。 【参考方案1】:

您的查询可能需要处理大量数据,这就是它需要这么长时间的原因。当然,还有其他可能导致查询变慢,例如资源争用。

对于给定的查询,我认为client_data(date, long_term_remaining_days) 上的索引可能是查询的最佳索引。

【讨论】:

以上是关于SQL中的聚合——如何加速查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL 速查表

hive 或 impala 中的计算表统计信息如何加速 Spark SQL 中的查询?

如何在 Teradata SQL 中使用 LEFT JOIN 对查询中的非聚合参数进行 GROUP BY?

将 spark 数据帧聚合转换为 SQL 查询; window、groupby 的问题,以及如何聚合?

查询分组中的 Oracle SQL 条件聚合函数

如何在 SQL Server 中的滑动窗口上聚合(计算不同的项目)?