如何减少 BigQuery 在查询期间扫描的数据量?

Saa*_*hir 1 sql google-bigquery google-cloud-platform

请有人告诉并解释以下多项选择题的正确答案?

\n\n

您有一个查询,该查询使用时间戳和 ID 列上的 WHERE 子句来过滤 BigQuery 表。通过使用,bq query \xe2\x80\x93-dry_run您将了解到查询会触发表的完整扫描,即使时间戳和 ID 上的过滤器选择了总体数据的一小部分。您希望通过对现有 SQL 查询进行最少的更改来减少 BigQuery 扫描的数据量。你该怎么办?

\n\n
    \n
  1. 为每个 ID 创建一个单独的表。
  2. \n
  3. 使用 LIMIT 关键字可以减少返回的行数。
  4. \n
  5. 重新创建带有分区列和聚集列的表。
  6. \n
  7. 使用该bq query --maximum_bytes_billed标志来限制计费的字节数。
  8. \n
\n

rob*_*emb 5

假设这是仅有的四个可能的答案,则答案几乎肯定是“使用分区列和聚集列重新创建表”。

让我们消除其他人:

  • 使用 LIMIT 关键字可以减少返回的行数。

这根本没有帮助,因为LIMIT 仅在全表扫描已经发生后应用,因此尽管有限制,您仍然需要支付相同的费用。

  • 为每个 ID 创建一个单独的表。

这似乎不太可能有帮助,因为除了组织混乱之外,您还必须查询每个表以找到所有正确的时间戳,并处理与以前相同数量的数据(但需要更多的工作) )。

  • 使用该bq query --maximum_bytes_billed标志来限制计费的字节数。

您可以这样做,但是当要计费的最大字节太高时,查询将失败,因此您将无法获得结果。


那么为什么要分区聚类呢?

BigQuery(按需)计费基于您选择的列以及您在这些列中读取的数据量。因此,您希望尽一切努力减少处理的数据量。

根据具体的查询,按时间戳分区允许您仅扫描相关日期的数据。与整个表扫描相比,这显然可以节省大量成本。

聚类允许通过基于聚类列的排序将常用数据放在一个表中,这样就可以消除基于过滤器(WHERE 子句)扫描不相关数据的需要。因此,您可以扫描更少的数据并降低成本。数据聚合也有类似的好处。

当然,这一切都假设您对实际进行的查询以及哪些列有意义进行集群有很好的理解。