我可以加速这个子查询嵌套的PostgreSQL查询吗

我可以加速这个子查询嵌套的PostgreSQL查询吗,sql,postgresql,Sql,Postgresql,我有下面的PostgreSQL代码(它可以工作,但速度很慢),我正在使用它创建一个物化视图,但是它非常慢,而且代码的长度对于多个子查询来说似乎很麻烦。我是否可以提高代码的执行速度或重写速度,从而使代码更短、更易于维护 CREATE MATERIALIZED VIEW station_views.obs_10_min_avg_ffdi_powerbi AS SELECT t.station_num, initcap(t.station_name) AS station_name,

我有下面的PostgreSQL代码(它可以工作,但速度很慢),我正在使用它创建一个物化视图,但是它非常慢,而且代码的长度对于多个子查询来说似乎很麻烦。我是否可以提高代码的执行速度或重写速度,从而使代码更短、更易于维护

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;

我得到的输出是每个气象站的一行(station_num&station_name)以及记录气象变量的日期和月份(avg_bom_fdi)。保留月值并将其转换为名称,以便在图表上绘制每月平均值。我还提取了该站点存在记录的总年数(记录年数)以及该数据集完整程度的百分比(每个数据集)。它们都来自第二个子查询(t2)。第一个子查询(t)用于平均每天的数据,并返回每日最大值、平均值和第95/99百分位数。

我认为您需要阅读一些关于执行计划的内容。这是了解你在做什么的好方法。 我向您推荐有关此问题的文档-

  • 我同意在此基础上运行解释计划/执行计划 询问
  • 此外,如果不需要,请按删除订单
  • 如果你看到了,很多 查看执行计划时获取特定值所花费的时间, 尝试在该特定列上创建索引
  • 取决于高 若你们决定索引,你们可以创建B树或位图索引

不包括order by条款。订单数据存储在一个表中,或者实质化视图是不相关的。最终输出时仅显示otder数据。谢谢,我将阅读解释/分析,看看是否可以改进运行时。