我正在尝试从数据集中的最新表中有效地查询,该数据集由 project_id:dataset:dataset_20160101
, project_id:dataset:dataset_20160102
等表格组成 .
此查询似乎是推荐的解决方案:
SELECT *
FROM `project_id.dataset.*`
WHERE _TABLE_SUFFIX=(SELECT MAX(table_id) FROM `project_id.dataset.__TABLES_SUMMARY__`)
但是,此查询要求我访问数据集中的所有表,而不仅仅是最新的表 . 这是为什么?
2 回答
当WHERE子句在伪列上使用常量表达式时,我们只能在查询运行之前修剪表,例如_TABLE_SUFFIX ='dataset_20160102' . 对于您的查询,由于WHERE子句包含一个不解析为常量的子uery,我们无法在查询运行之前修剪表 . 而是从所有表中读取数据并执行子查询 . 然后将数据与子查询结果连接并过滤 .
在查询执行期间可以修剪表 . 启动查询,执行子查询,修剪表和读取数据 . 但它还没有ETA .
现在,如果你有一个插入表的管道,那么在管道的末尾你可以(1)得到MAX(table_id)(2)创建一个带有以下查询的视图:
然后,只要您想查询数据,就可以查询视图,并指定_DATA_DATE = _LATEST_DATE作为过滤器 . 在这种情况下,_LATEST_DATE是预先计算的,因此它是常量 . 正如华解释的那样,您只需要处理最新的表格 .