2017-06-19 38 views
4

我试图从最新表是由形式project_id:dataset:dataset_20160101project_id:dataset:dataset_20160102的BigQuery查询最新表高效

这个查询好像是推荐的解决方案的表的数据集高效地查询:

SELECT * 
FROM `project_id.dataset.*` 
WHERE _TABLE_SUFFIX=(SELECT MAX(table_id) FROM `project_id.dataset.__TABLES_SUMMARY__`) 

然而,这个查询我开账单访问所有表中的数据集,而不只是最新的一个。这是为什么?

+0

我有同样的问题,我认为这是谷歌方面的错误。当我比较使用_TABLE_SUFFIX的硬编码值运行查询时,执行时间相同。似乎正在处理相同数量。 – Florent

回答

0

我们只能修剪表时的WHERE子句使用所述伪柱的常量表达式查询运行之前,例如,_TABLE_SUFFIX =“dataset_20160102”。对于您的查询,由于WHERE子句包含一个不解析为常量的子查询,所以在查询运行之前,我们不能修剪这些表。而是从所有表中读取数据并执行子查询。然后将数据与子查询结果连接并进行过滤。

这是可能的查询执行过程中修剪表。开始查询,执行子查询,修剪表格并读取数据。但目前还没有ETA。

0

现在,如果你有一个管道,其插入表,然后在流水线的末端,你可以 (1)获得MAX(table_id的) (2)创建具有以下查询视图:

SELECT 
     *, 
     DATE max_table_id AS _LATEST_DATE, 
     PARSE_DATE('%E4Y%m%d', _TABLE_SUFFIX) AS _DATA_DATE 
FROM `project_id.dataset.*` 

然后,每当你要查询的数据,你可以只对查询视图,并指定_DATA_DATE = _LATEST_DATE作为过滤器。在这种情况下,_LATEST_DATE是预先计算的,所以它是不变的。正如华解释的那样,您只会处理最新的表格。