Как я могу сделать этот запрос быстрее?(POSTGRESQL) - PullRequest
0 голосов
/ 16 декабря 2018

Target - Day_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); 

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

С правильными индексами, я подозреваю, это будет быстрее:

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)

Это лучшее, что я могу сделать с запросом, который вы дали.Может быть лучший способ написать запрос.Я бы посоветовал вам задать другой вопрос с примерами данных, желаемыми результатами и объяснением того, что делает (или должен делать) запрос, если вам нужна помощь в этом.

0 голосов
/ 16 декабря 2018

reg_time заключено в функцию даты.

, если reg_time - индексированный столбец, включающий reg_time с функцией даты, прерывающей индексированный поиск.Вы должны учитывать, что не следует использовать date(reg_time)

. Вы также можете определить проблемы с запросом, используя SQL Explain Plan

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...