第一行的物化视图

Posted

技术标签:

【中文标题】第一行的物化视图【英文标题】:Materialized view of first rows 【发布时间】:2019-05-28 21:42:29 【问题描述】:

假设我有一个包含 date | group_id | user_id | text 列的表格,我想获取每个 group_id/user_id 对的前 3 个文本(按日期)。

每 3 小时查询一次整个表似乎很浪费,因为一旦设置给定对,结果不太可能改变,所以我查看了物化视图,但示例是关于 single rows,而不是行集.

另一个问题是date 列与提取日期不对应,这是否意味着我必须添加一个提取日期列才能在预定查询中使用@run_time

或者,在将批处理与主表合并之前,将批处理加载到单独的表上,将其与/更新“第一个/物化”表进行比较/更新是否更明智? (因此,不是在主表上进行查询,而是在每次加载时抢先填充物化表)。这看起来 hacky/错误

【问题讨论】:

【参考方案1】:

问题链接到I want a "materialized view" of the latest records,并提到它处理单行而不是多行。问题是它想要 3 个最新的行而不是只有一个。

为此,请查看该答案中的内部查询。而不是这样做:

  SELECT latest_row.* 
  FROM (
    SELECT ARRAY_AGG(a ORDER BY datehour DESC LIMIT 1)[OFFSET(0)] latest_row
    FROM `fh-bigquery.wikipedia_v3.pageviews_2018` a
    WHERE datehour > TIMESTAMP_SUB(@run_time, INTERVAL 1 DAY )
    # change to CURRENT_TIMESTAMP() or let scheduled queries do it
    AND datehour > '2000-01-01' # nag
    AND wiki='en' AND title LIKE 'A%'
    GROUP BY title
  )

这样做:

  SELECT latest_row.* 
  FROM (
    SELECT ARRAY_AGG(a ORDER BY datehour DESC LIMIT 3)[OFFSET(0)] latest_row
    FROM `fh-bigquery.wikipedia_v3.pageviews_2018` a
    WHERE datehour > TIMESTAMP_SUB(@run_time, INTERVAL 1 DAY )
    # change to CURRENT_TIMESTAMP() or let scheduled queries do it
    AND datehour > '2000-01-01' # nag
    AND wiki='en' AND title LIKE 'A%'
    GROUP BY title
  )

Re @run_time - 您可以将其与任何列进行比较,只需确保有一列对您要实现的逻辑有意义。

【讨论】:

以上是关于第一行的物化视图的主要内容,如果未能解决你的问题,请参考以下文章

为啥在物化视图上使用 NoSQL?

oracle物化视图不会自动更新是怎么回事

Oracle物化视图

物化视图

Oracle物化视图梳理

物化视图