繁体   English   中英

我怎样才能更快地查询? (PostgreSQL系统)

[英]How can i do this query faster? (postgreSQL)

目标-第1天的滚动保留率(%)

问题:

1)我如何加快查询速度?

2)此会话对数字是否减慢查询?

3)我还有其他选择来回圆()吗? 还是最佳?

查询:

SELECT date(reg_time), round(CAST(count(DISTINCT du.uid) / count(DISTINCT users.uid)::float * 100 AS numeric), 2) AS rolling_retention_day1
FROM users 
LEFT JOIN dailyusers du 
ON users.uid = du.uid
AND date(reg_time) BETWEEN current_date - interval '30' DAY AND current_date 
AND date(reg_time) + 1 <= day
GROUP BY date(reg_time); 

reg_time包含在date函数中。

如果reg_time是索引列,则使用date函数将reg_time括起来会中断索引搜索。 您需要考虑不要使用date(reg_time)

您还可以使用SQL Explain Plan来确定查询问题

使用正确的索引,我怀疑这会更快:

SELECT reg_date, AVG(du_flag) as rolling_retention_day1
FROM (SELECT date(u.reg_time) as reg_date,
             (CASE WHEN EXISTS (SELECT 1 
                                FROM dailyusers du
                                WHERE du.uid = u.uid AND
                                      date(u.reg_time) + 1 <= du.day
                               )
                   THEN 1 ELSE 0
              END) as du_flag
      FROM users u
      WHERE u.reg_time >= current_date - interval '30' day AND
            u.reg_time < current_date + interval '1' day
     )
GROUP BY reg_date;

您想要在users(reg_time)dailyusers(uid, day)上建立索引。 假设uidusers是唯一的,这对我来说很有意义。

如果您真的关心平均值的格式,则可以执行以下操作:

AVG(du_flag)::decimal(4, 2)

这是我所能提供的最佳查询。 可能有更好的方式编写查询。 如果您需要帮助,我建议您提出另一个问题,其中包括示例数据,所需结果以及对查询正在执行(或应该执行)的解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM