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.
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. –