簡體   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