BigQuery 集群字段用法/值不清楚

Posted

技术标签:

【中文标题】BigQuery 集群字段用法/值不清楚【英文标题】:BigQuery Cluster field usage/value not clear 【发布时间】: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

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

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

我正在使用这个 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/… 【参考方案1】:

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

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

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

【讨论】:

以上是关于BigQuery 集群字段用法/值不清楚的主要内容,如果未能解决你的问题,请参考以下文章

如何加入 Firebase 和 BigQuery

BigQuery:加入集群字段

BigQuery 表如何与分区和集群字段一起使用?

上个月的最后一天 - BigQuery

BigQuery 隐藏 UDF 实现

BigQuery:无效日期错误