2017-01-12 3 views
0

以下の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, 
    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; 

私が手出力が天候変数が記録されていることを日&月(avg_bom_fdi)とともに各気象観測所(station_num & STATION_NAME)の行です。月の値は保持され、グラフ上の月ごとに平均化された値をプロットする目的で名前に変換されます。私はまた、その駅の録音が存在する年数(record_years)とそのデータセットの完成度(per_datset)のパーセンテージを引き出します。これらは両方とも第2サブクエリ(t2)から来ます。最初のサブクエリ(t)は、1日あたりのデータを平均し、毎日の最大、平均、および95/99百分位数を返すために使用されます。

+0

order by句を含めないでください。オーダー・データは表に保管されるか、マテリアライズド・ビューは関係ありません。最終出力時のデータのみ。 –

答えて

0
  • 私はこの クエリに実行計画/実行計画を実行に同意します。
  • あなたが実行計画を見直しながら、特定の値をフェッチに費やさ 時間の、多くが表示された場合も、
  • により削除順序を必要としない場合は、 は、その特定の列に索引を作成してみてください。
  • 高い数字 に応じて、索引を決定する場合は、Bツリーまたはビットマップ索引を作成できます。
+0

ありがとう、私は実行時を改善できるかどうかを見るためにexplain/analyzeを読み上げます。 – samuelf

0

私は実行計画について何かお読みになる必要があると思います。あなたが何をしているのかを理解するのは良い方法です。 私はこの問題に関するあなたのドキュメントをお勧めします - LINK

関連する問題