0
SELECT CASE WHEN avg(count)>12 THEN 5
            WHEN avg(count)>8  THEN 4
            WHEN avg(count)>2  THEN 3
            WHEN avg(count)>1  THEN 2
            ELSE 1
            END,madeby
FROM (SELECT M.month,(SELECT count(*)
                     FROM Booking
                     WHERE date_trunc('month',starttime)=month
                         AND madeby=M.madeby
                     ) AS count,M.madeby
     FROM (SELECT date_trunc('month',generate_series(min(starttime),
                            current_timestamp,interval '1 month')::timestamp)
                            AS month,madeby
          FROM Booking
          GROUP BY madeby
     ) AS M
) AS BookingsPerMonth
GROUP BY madeby;

今、私はそこでその計算を行う必要があります、私はそれを疑っていません。問題は、集計関数を平均4回計算していることだと思います。時間の違いは、CASEを使用した場合の約17秒から、使用しない場合の約4.5秒までです(ただし、十分な情報が不足しています)

時間を4.5秒に近づけるなど、可変ストレージなどを使用してこれを最適化する方法はありますか?

4

2 に答える 2

2
SELECT  
    CASE 
        WHEN avg_count > 12 THEN 5
        WHEN avg_count > 8  THEN 4
        WHEN avg_count > 2  THEN 3
        WHEN avg_count > 1  THEN 2
        ELSE 1
    END,
    madeby
FROM (
    SELECT avg(count) as avg_count, madeby
    FROM (
        SELECT 
            M.month,
            (
                SELECT count(*)
                FROM Booking
                WHERE date_trunc('month',starttime)=month AND madeby=M.madeby
            ) AS count, 
            M.madeby
        FROM (
            SELECT 
                date_trunc('month',generate_series(min(starttime),
                current_timestamp,interval '1 month')::timestamp) AS month,
                madeby
            FROM Booking
            GROUP BY madeby
        ) AS M
    ) AS BookingsPerMonth
    GROUP BY madeby
) AS Averages;
于 2012-05-28T11:38:43.223 に答える
0

次のように、PGに平均を1回だけ計算させようとします(頭から離れて):

代わりに

SELECT CASE WHEN avg(count)>12 THEN 5
            WHEN avg(count)>8  THEN 4
...

行う

SELECT CASE WHEN avgcount>12 THEN 5
            WHEN avgcount>8  THEN 4
...

そして交換

FROM (SELECT M.month,(SELECT count(*)
...
                     ) AS count,M.madeby

FROM (SELECT avg(M.month),(SELECT count(*)
...
                     ) AS avgcount,M.madeby

さようなら、S.

于 2012-05-28T12:06:24.183 に答える