2016-06-21 7 views
0

Ich habe eine Postgresql-Datenbank mit einem denormalized Schema (1 Tabelle) mit rund 4 Millionen Einträge. Jetzt habe ich diese Frage:Gain Perfomance von Postgresql Abfrage

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%'; 

Dies dauert etwa 14 Sekunden bis 2 Minuten (hängt davon ab, wie viel andere Sachen los ist). aber mein Server, der eine VM mit Ubuntu auf Azure gehostet ist, hat immer beide CPUs von 100% abgedeckt. Wenn ich die Statistiken von Postgesql überprüfen, ist es meistens diese Abfrage, die die gesamte CPU blockiert. Es ist eine D2 VM mit 2 Kernen, 7 GB SSD. Gibt es eine Möglichkeit, dies zu beschleunigen, ohne mein Azure Package zu aktualisieren?

+0

Haben Sie die Auswirkungen auf die Leistung des Denormalisation überprüfen? Angesichts der Tatsache, dass sich diese Abfrage nur auf drei Spalten bezieht, würde die Normalisierung den Speicherbedarf dieser Abfrage definitiv verringern. – joop

Antwort

2

Statt all diesen Unterabfragen verwenden case Ausdrücke bedingte Aggregation zu tun:

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