【问题标题】:BigQuery Cluster field usage/value not clearBigQuery 集群字段用法/值不清楚
【发布时间】:2018-12-30 19:55:26
【问题描述】:

我创建了一个带有集群文件的表,但我没有看到任何保存或任何性能改进,这就是我所做的:

我创建了一个包含 3 列的目标表:projectId、tableId 和 schema 使用此 SQL:

SELECT projectId, tableId, schema 
FROM `project.dataset.tables` 
WHERE _partitionTime >= '2018-12-27 00:00:00'

分区字段:默认分区时间 集群字段:projectId、tableId

这条sql的原成本是:$2.82

现在从我期望的新表中选择时

  1. 降低成本
  2. 为了获得更好的性能

我正在使用这个 SQL

SELECT * FROM `project.table.testCluster` 
WHERE  projectId = 'xxx' and tableId = 'yyy' 
AND _PARTITIONTIME >= TIMESTAMP("2018-12-30") LIMIT 1000

从我的基准测试和 BigQuery 控制台执行报告中我都没有看到

有什么想法吗?

【问题讨论】:

  • 您的屏幕截图显示 578GB 查询已减少到 346 MB 已处理。我想你只是错过了。
  • 看起来 dryRun API 和 Run API 返回不同的字节进程 620558572756 Vs 363303416 也许这就是我的问题所在。但是仍然不确定我看到了什么
  • 这是这样设计的。 DryRun 无法返回优化的查询成本,并将返回完整的扫描数。执行查询后始终信任统计信息。
  • 谢谢,你知道cluster字段中逗号分隔是什么意思吗?
  • 您可以有5个维度进行聚类(例如:大洲、国家、地区、县、市),具体示例请阅读这篇博文:medium.com/google-cloud/…

标签: google-bigquery


【解决方案1】:

BigQuery 根据聚簇列中的值对聚簇表中的数据进行排序,并将它们组织成块。当您提交的查询包含对聚集列的过滤器时,BigQuery 会使用聚集信息来有效地确定块是否包含与查询相关的任何数据。

这允许 BigQuery 仅扫描相关块 - 这一过程称为块修剪。

这里有一个小问题。 BigQuery 在运行查询之前估计每个查询将查询多少数据。没有聚类,所述估计是准确的。通过聚类,估计值是一个上限,并且查询最终可能会查询更少或可能保持不变。这取决于聚簇列的结构。聚集列中的唯一值越高,优化越低。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 2015-10-26
    • 2011-07-22
    • 1970-01-01
    相关资源
    最近更新 更多