首页 > 解决方案 > BigQuery - 集群表不使用多个键减少查询大小

问题描述

我正在尝试优化我在 BigQuery 中的查询成本,并且我一直在尝试聚集表。供参考:BigQuery - 仅使用键值模式查询表中的键子集

按单列对表进行聚类成功地减少了我的查询大小。但是,使用多个列(示例显示在:https ://cloud.google.com/bigquery/docs/querying-clustered-tables#sample_table_used_in_the_examples )不会导致查询大小的任何减少。

要使用文档中给出的示例,

SELECT
  SUM(totalSale)
FROM
  mydataset.ClusteredSalesData
WHERE
  customer_id = 10000
  AND product_id LIKE 'gcp_analytics%'

如果表上没有集群,这将查询整个数据集(例如,100GB),当仅由 customer_id 集群时减少到大约 10GB(在实际运行后看到,而不是在验证器上),但在集群时完全没有变化customer_id 和 product_id (即使在实际运行查询之后)。

我尝试过更改聚类的顺序、WHERE 子句的顺序等。似乎没有任何改变。

这是预期的行为吗?BigQuery 上的错误?还是我做错了什么?

更新:感谢@Pentium10 指点我:https ://medium.com/@hoffa/bigquery-optimized-cluster-your-tables-65e2f684594b

要使用博文中的示例,在以下两个查询中,

Q1:

SELECT wiki, SUM(views) views
FROM fh-bigquery.wikipedia_v3.pageviews_2017
WHERE DATE(datehour) BETWEEN '2017-06-01' AND '2017-06-30'
AND wiki = 'en'
--AND title = 'Barcelona'
GROUP BY wiki ORDER BY wiki

Q2:

SELECT wiki, SUM(views) views
FROM fh-bigquery.wikipedia_v3.pageviews_2017
WHERE DATE(datehour) BETWEEN '2017-06-01' AND '2017-06-30'
AND wiki = 'en'
AND title = 'Barcelona'
GROUP BY wiki ORDER BY wiki

我本来预计第二季度会更便宜,因为集群是按(wiki,title),但事实似乎并非如此。

标签: google-cloud-platformgoogle-bigquery

解决方案


在您的查询 1 (Q1) - 估计处理成本为 0.43 美元86.1 GB- 实际字节数计费 -18.4 GB

对于第二季度 - 估计处理成本 0.90 美元180 GB- 实际字节计费 -10.3 GB

对我来说听起来更便宜:o)

但在现实中,save 甚至不止是down to 10.3 GB from 18.4 GB- 它实际上是down to 10.3 GB from 38.6 GB. 这是因为在 Q1 中根本没有title涉及列,而在 Q2 中却是!
所以,为了比较苹果和苹果——你可以添加title如下——你会看到估计的成本是180 GB——而实际的字节数是计费的——38.6 GB

问题 3:

SELECT wiki, title, SUM(views) views
FROM `fh-bigquery.wikipedia_v3.pageviews_2017`
WHERE DATE(datehour) BETWEEN '2017-06-01' AND '2017-06-30'
AND wiki = 'en'
-- AND title = 'Barcelona'
GROUP BY wiki, title   

注意/提醒:当您查询聚集表时 - 估计仅基于分区显示(截至目前 - 我的理解是稍后这将被修复/改进)


推荐阅读