2016-12-02 3 views
1

Rails 5.0アプリケーションでは、次のようなpostgresクエリがあります。最初のクエリは、基本的に国内と国際放送局(ラジオカテゴリ)とFMとAM(ラジオタイプ)による視聴率とグループを合計します。 2番目のクエリは、FM/AMによるすべての国内および国際放送局およびグループの視聴者数を合計します。postgresクエリのこの結合をより効率的にする方法は、マテリアライズドビューを使用することですか?

より効率的にするには、最終的にマテリアライズド・ビューで合計する必要がある数値のみをプルするためにraw SELECT文を入力してから、SUM()/ GROUP_BY文ビューから抜け出すには?

SUM()を巧みに使用していますが、私にはselect *の生の数字が一度だけ表示されますか?

たとえば、少なくとも100万行のデータがあるとします。

SELECT numbers.snapshot_id, 
     count(*) AS radio_count, 
     sum(numbers.view_count) AS view_count, 
     radios.category AS radio_category, 
     radios.type AS radio_type, 
     CASE 
     WHEN radios.type = 'AM' THEN 0 
     WHEN radios.type = 'FM' THEN 1 
     END as radio_enum_type 
    FROM (numbers 
     JOIN radios ON ((radios.id = numbers.radio_id))) 
    GROUP BY numbers.snapshot_id, radios.category, radios.type 
    UNION 
    SELECT numbers.snapshot_id, 
     count(*) AS radio_count, 
     sum(numbers.view_count) AS view_count, 
     3 AS radio_category, 
     radios.type AS radio_type, 
     CASE 
     WHEN radios.type = 'AM' THEN 0 
     WHEN radios.type = 'FM' THEN 1 
     END as radio_enum_type 
    FROM (numbers 
     JOIN radios ON ((radios.id = numbers.radio_id))) 
    GROUP BY numbers.snapshot_id, 3::integer, radios.type 

答えて

1

UNIONなしで行を追加することはできません。これがより良いかどうかは分かりませんが、集計を事前に計算してからUNIONを作成できます。しかし、多分あなたのクエリはPostgresのことで、最適化されますと同じかもしれません...

WITH aggregated_numbers AS (
    SELECT numbers.snapshot_id, 
    count(*) AS radio_count, 
    sum(numbers.view_count) AS view_count, 
    radios.category AS radio_category, 
    radios.type AS radio_type, 
    CASE 
    WHEN radios.type = 'AM' THEN 0 
    WHEN radios.type = 'FM' THEN 1 
    END as radio_enum_type 
FROM (numbers 
    JOIN radios ON ((radios.id = numbers.radio_id))) 
GROUP BY numbers.snapshot_id, radios.category, radios.type) 
SELECT * FROM aggregated_numbers 
UNION 
SELECT 
    snapshot_id, 
    sum(radio_count) as radio_count, 
    view_count, 
    3 as radio_category, 
    radio_type, 
    radio_enum_type 
FROM aggregated_numbers 
+0

おかげで、それは、HTML内のデータを表示するだけですべてですので、私はで二回選択クエリを実行する必要がありますする非効率的なように見えたと思いました私が望む集計の合計を得るために別の 'group by'を使用しました。 – Nona

関連する問題