2017-01-12 7 views
0

Ich habe den folgenden PostgreSQL-Code (der funktioniert, aber langsam), die ich verwenden, um eine materialisierte Ansicht zu erstellen, aber es ist ziemlich langsam und die Länge des Codes scheint mit dem Multiple umständlich Unterabfragen. Kann ich die Geschwindigkeit, mit der dieser Code ausgeführt wird, verbessern oder umschreiben, damit er kürzer und einfacher zu warten ist?Kann ich diese Unterabfrage verschachtelte PostgreSQL-Abfrage beschleunigen

CREATE MATERIALIZED VIEW station_views.obs_10_min_avg_ffdi_powerbi AS 
SELECT t.station_num, 
    initcap(t.station_name) AS station_name, 
    t.day, 
    t.month_int, 
    to_char(to_timestamp(t.month_int::text, 'MM'), 'TMMonth') AS Month, 
    round(((date_part('year', age(t2.dmax, t2.dmin)) * 12 + date_part('month', age(t2.dmax, t2.dmin)))/12)::numeric, 1) AS record_years, 
    round((t2.count_all_vals/t2.max_10_periods * 100)::numeric, 1) AS per_datset, 
    max(t.avg_bom_fdi) AS max, 
    avg(t.avg_bom_fdi) AS avg, 
    percentile_cont(0.95) WITHIN GROUP (ORDER BY t.avg_bom_fdi) AS percentile_cont_95, 
    percentile_cont(0.99) WITHIN GROUP (ORDER BY t.avg_bom_fdi) AS percentile_cont_99 
    FROM (SELECT a.station_num, 
      d.station_name, 
      a.ten_minute_intervals_utc, 
      date_part('day', a.ten_minute_intervals_utc) AS day, 
      date_part('month', a.ten_minute_intervals_utc) AS month_int, 
      a.avg_bom_fdi 
      FROM analysis.obs_10_min_avg_ffdi_bom a, 
      obs_minute_stn_det d 
      WHERE d.station_num = a.station_num) t, 
    (SELECT obs_10_min_avg_ffdi_bom_view.station_num, 
      obs_10_min_avg_ffdi_bom_view.station_name, 
      min(obs_10_min_avg_ffdi_bom_view.ten_minute_intervals_utc) AS dmin, 
      max(obs_10_min_avg_ffdi_bom_view.ten_minute_intervals_utc) AS dmax, 
      date_part('epoch', max(obs_10_min_avg_ffdi_bom_view.ten_minute_intervals_utc) - min(obs_10_min_avg_ffdi_bom_view.ten_minute_intervals_utc))/600 AS max_10_periods, 
      count(*) AS count_all_vals 
      FROM analysis.obs_10_min_avg_ffdi_bom_view 
      GROUP BY obs_10_min_avg_ffdi_bom_view.station_num, obs_10_min_avg_ffdi_bom_view.station_name) t2 
    WHERE t.station_num = t2.station_num 
    GROUP BY t.station_num, t.station_name, Month, t.month_int, t.day, record_years, per_datset 
    ORDER BY t.month_int, t.day 
WITH DATA; 

Der Ausgang I erhalten, ist eine Zeile für jede Wetterstation (station_num & station_name) zusammen mit dem Tag & Monat, dass eine Wettervariable aufgezeichnet (avg_bom_fdi). Der Monatswert wird beibehalten und in einen Namen umgewandelt, um die auf dem Diagramm gemittelten Werte pro Monat darzustellen. Ich ziehe auch die Gesamtzahl der Jahre, in denen Aufzeichnungen für diese Station existieren (record_years) und einen Prozentsatz davon, wie vollständig diese Datenmenge ist (per_datset). Diese beiden stammen aus der zweiten Unterabfrage (t2). Die erste Unterabfrage (t) wird verwendet, um die Daten pro Tag zu mitteln und die täglichen maximalen, durchschnittlichen und 95/99-Perzentile zurückzugeben.

+0

Nicht die Reihenfolge nach Klausel einschließen. Die Auftragsdaten werden in einer Tabelle gespeichert oder eine materialisierte Ansicht ist irrelevant. Nur otder Daten am endgültigen Ausgang. –

Antwort

0
  • Ich stimme mit dem dem Plan/Ausführungsplan auf dieser Abfrage erklärt ausgeführt wird. wenn nicht entfernen benötigt
  • Auch durch
  • Wenn Sie sehen, viele verbrachte Zeit auf einen bestimmten Wert zu holen, während Ausführungsplan überprüft, versuchen einen Index für diese bestimmte Spalte zu schaffen.
  • Abhängig von der hohen und niedrigen Kardinalität, können Sie B-Tree oder Bit Map Index erstellen, wenn Sie sich für den Index entscheiden.
+0

danke, ich werde auf erklären/analysieren nachlesen, ob ich die Laufzeit verbessern kann. – samuelf

0

Ich denke, Sie müssen etwas über Ausführungsplan lesen. Es ist ein guter Weg, um zu verstehen, was Sie mit Ihrer Anfrage machen. ich empfohlen, dass Sie Dokumentation zu diesem Problem - LINK

Verwandte Themen