【问题标题】:Is the way to make this union of postgres queries more efficient is to use a materialized view?使这种 postgres 查询联合更有效的方法是使用物化视图吗?
【发布时间】:2016-12-05 23:39:56
【问题描述】:

所以现在,我在 Rails 5.0 应用程序中有以下 postgres 查询 - 第一个查询基本上汇总了国内和国际电台 (radio_category) 以及 FM 和 AM (radio_type) 的收视率和组。第二个查询按 FM/AM 统计所有国内和国际电台和组的收视率。

为了提高效率,最好尝试编写一个原始选择语句以仅提取最终需要在物化视图中求和的数字,然后编写 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

【问题讨论】:

    标签: ruby-on-rails postgresql


    【解决方案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
    

    【讨论】:

    • 谢谢,这一切都只是为了在 HTML 中显示数据,所以我认为必须使用不同的 group by 运行两次选择查询来获得我想要的汇总总数似乎效率低下。
    猜你喜欢
    • 1970-01-01
    • 2011-05-12
    • 2019-09-15
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2022-06-16
    相关资源
    最近更新 更多