2016-06-21 25 views
0

私は約4百万エントリの非正規化スキーマ(1テーブル)を持つpostgresqlデータベースを持っています。これは、2分に約14秒かかります(多くの他のものが起こっているかによって異なります)Postgresqlクエリのパフォーマンスを向上

SELECT 
    count(*) AS Total, 
    (SELECT count(*) FROM table 
    WHERE "Timestamp" > current_timestamp - INTERVAL '1 hour' AND "tableName" LIKE '%ping%') AS hour, 

    (SELECT count(*) FROM table 
    WHERE "Timestamp" > now() :: DATE AND "tableName" LIKE '%ping%') AS day, 

    (SELECT count(*) 
    FROM table 
    WHERE "Timestamp" > now() :: DATE - INTERVAL '1 day' AND 
     "Timestamp" <= now() :: DATE - INTERVAL '1 day' AND "tableName" LIKE '%ping%') AS yesterday, 

    (SELECT count(*) FROM table 
    WHERE "Timestamp" > now() :: DATE - INTERVAL '2 day' AND 
     "Timestamp" <= now() :: DATE - INTERVAL '1 day' AND "tableName" LIKE '%ping%') AS "dayBeforeYesterday", 

    (SELECT count(*) 
    FROM table WHERE "Timestamp" > current_timestamp - INTERVAL '1 week' AND "tableName" LIKE '%ping%') AS week, 

    (SELECT count(*) 
    FROM table 
    WHERE "Timetamp" > current_timestamp - INTERVAL '2 week' AND 
     "Timestamp" < current_timestamp - INTERVAL '1 week' AND "tableName" LIKE '%ping%') AS "lastWeek", 

    (SELECT count(*) 
    FROM table 
    WHERE "Timestamp" > current_timestamp - INTERVAL '3 week' AND 
     "Timestamp" < current_timestamp - INTERVAL '2 week' AND "tableName" LIKE '%ping%') AS "weekBeforeLastWeek", 

    (SELECT count(*) 
    FROM table 
    WHERE"Timestamp" > current_timestamp - INTERVAL '1 month' AND "tableName" LIKE '%ping%')AS month 

FROM table WHERE "tableName" LIKE '%ping%'; 

:今、私はこのクエリを持っています。 Azureでホストされたubuntuを持つVMである私のサーバは常に両方のCPUを100%カバーしています。 私はpostgesqlの統計をチェックすると、それは主にCPU全体をブロックするこのクエリです。 2コア、7GB SSDのD2 VMです。 Azureパッケージをアップグレードせずにこれをスピードアップする方法はありますか?代わりに、これらすべてのサブクエリの

+0

あなたはdenormalisationのパフォーマンスへの影響を確認しましたか?このクエリが3つの列のみを参照するという事実を考えると、正規化はこのクエリのメモリフットプリントを確実に減少させるでしょう。 – joop

答えて

2

、条件付きの集約を行うためにcase式を使用:

SELECT 
    count(*) AS Total, 
    count(case when "Timestamp" > current_timestamp - INTERVAL '1 hour' AND "tableName" LIKE '%ping%' then 1 end) AS hour, 
... 
関連する問題