我有一个名为sample和table_201606的数据集,table_201607,直到table_201710。然后我想要完成的是从最新的TABLE SUFFIX获取数据,这是table_201710。以下是我的查询:
WITH max_table_time AS(
SELECT
TIMESTAMP_ADD(MAX(time), INTERVAL 1 HOUR) AS max_time,
FORMAT_DATE("%Y%m", DATE(MAX(time))) AS par
FROM
`sample.table_*`
),
xyz as(
SELECT id, sum(total_a) as total_b, sum(total_c) as sum_total
FROM `sample.table_*`
WHERE _TABLE_SUFFIX = (SELECT par from play_partitions)
GROUP BY video_id
)
SELECT * FROM xyz
不知何故,上面的查询,扫描所有表(从table_201606到table_201710),但结果很好(table_201710中的数据)。
但是,当我尝试这个时,结果会有所不同:
WITH max_table_time AS(
SELECT
TIMESTAMP_ADD(MAX(time), INTERVAL 1 HOUR) AS max_time,
FORMAT_DATE("%Y%m", DATE(MAX(time))) AS par
FROM
`sample.table_*`
),
xyz as(
SELECT id, sum(total_a) as total_b, sum(total_c) as sum_total
FROM `sample.table_*`
WHERE _TABLE_SUFFIX = '201710'
GROUP BY video_id
)
SELECT * FROM xyz
上面的查询,只扫描了table_201710以及位于table_201710中的结果数据。与第一个查询不同,它扫描所有表但产生位于table_201710中的正确数据。
我怎么能说第一个查询扫描了所有表?因为当我执行第一个查询时,BigQuery控制台只是说我使用10 GB数据而不是第二个查询只使用在该进程上处理的200 MB数据。
我想知道为什么,有人可以解释一下吗?
答案 0 :(得分:0)
仔细阅读BigQuery中的通配符表,找到这些句子:
使用_TABLE_SUFFIX可以大大减少扫描的字节数,从而降低运行查询的成本。 包含子查询的_TABLE_SUFFIX上的筛选器不能用于限制为通配符表扫描的表的数量。例如,以下查询不限制为通配符表扫描的表bigquery-public-data.noaa_gsod.gsod19 *
我在做这些查询之前没有做RTFM。 :D