【发布时间】:2021-07-18 03:45:01
【问题描述】:
我有一个包含约 5k 个唯一 ID 的 BigQuery 表。每天都会为可能已经存在或不存在的 ID 插入新行。
我们使用这个查询来查找最近的行:
SELECT t.*
EXCEPT (seqnum),
FROM (SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY id
ORDER BY date_of_data DESC
) as seqnum
FROM `[project]`.[dataset].[table] t
) t
WHERE seqnum = 1
虽然我们只需要每个 ID 的最新行,但此查询必须扫描整个表。随着表大小的增长,此查询每天都会变得更慢且成本更高。现在,对于一个 8GB 的表,上面的查询创建了一个 22MB 的表。如果它可以保持最新,我们更愿意查询 22MB 表。
是否可以创建一个物化视图来获取每个 ID 的最新行?
有没有比将表格扩展到无穷大更好的解决方案?
其他要求:
- 保留历史数据(某处)
- 无法使用更新 - 我们每天会更新超过 1,500 个 - https://cloud.google.com/bigquery/quotas
【问题讨论】:
-
使用
_PARTITIONTIME -
@drum 你能详细说明一下吗?
-
按摄取时间对表进行分区,_PARTITIONTIME 列将可供您使用。这实际上是摄取时间,因此您可以或多或少地分辨出哪些是新记录。
-
谢谢。该表已被
date_of_data分区。我正在寻找最新的行per id。我不只是在寻找最新的记录,而是在寻找每个 id 的最新记录。所以一个可能在最新的记录中,但如果另一个 ID 多年来未能更新,那么它将是从 2018 年开始,等等。
标签: sql google-cloud-platform google-bigquery materialized-views