【问题标题】:Why does BigQuery scan entire table although it's partitioned by hour?为什么 BigQuery 会扫描整个表,尽管它是按小时分区的?
【发布时间】:2020-11-16 09:58:08
【问题描述】:

此表按小时分区:

SELECT *
FROM `blockchain-etl-internal.crypto_ethereum_partitioned.logs_by_topic_0xd78`
WHERE block_timestamp >= '2020-11-14 00:00:00' and block_timestamp < '2020-11-14 01:00:00'
ORDER BY block_timestamp DESC

但是,我指定 BigQuery 对 block_timestamp 的任何过滤器都会扫描整个表。您可以在查询中查看该表的大小和扫描的数据量以确保。

BigQuery 不应该只扫描被过滤掉的分区中的数据吗?

【问题讨论】:

  • 桌子的尺寸是多少?
  • @MikhailBerlyant 大约 400MB
  • 您的过滤器不是按小时而是按日期,您是否尝试过按小时过滤,看看它是否仍然扫描整个表?
  • 刚刚更新了按小时过滤的问题。它仍然扫描整个表。顺便说一句,问题中的表格是公开的
  • 如果您检查该表的分区信息(例如通过 $__PARTITIONS_SUMMARY__),您会发现没有分区并且所有数据都属于所谓的 _UNPARTITIONED 分区 - 这将解释你的问题 - 但现在真正的问题是如何将表明确设置为按小时分区??!!

标签: google-bigquery


【解决方案1】:

这是因为表中的所有行仍然在UNPARTITIONED 分区中,并且没有被重新分区到它们对应的分区中。仅当有足够的数据(字节大小至少达到某个阈值)时才会触发重新分区 (https://cloud.google.com/bigquery/streaming-data-into-bigquery#streaming_into_partitioned_tables)。

目前,此阈值设置为 5gb,而您所说的表大约有 400mb。

【讨论】:

  • 那些 5gb 有记录吗?不知怎的,我不记得这个号码了:o(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 2010-11-30
  • 2018-12-23
  • 2015-01-25
相关资源
最近更新 更多