[英]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)
上建立索引。 假設uid
在users
是唯一的,這對我來說很有意義。
如果您真的關心平均值的格式,則可以執行以下操作:
AVG(du_flag)::decimal(4, 2)
這是我所能提供的最佳查詢。 可能有更好的方式編寫查詢。 如果您需要幫助,我建議您提出另一個問題,其中包括示例數據,所需結果以及對查詢正在執行(或應該執行)的解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.