1

我有名为 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 数据。

我想知道为什么,有人可以解释一下吗?

4

1 回答 1

0

刚刚仔细阅读了BigQuery中的通配符表,发现了这几句话:

使用 _TABLE_SUFFIX 可以大大减少扫描的字节数,从而降低运行查询的成本。_TABLE_SUFFIX 上包含子查询的过滤器不能用于限制扫描通配符表的表数。例如,以下查询不限制扫描通配符表 bigquery-public-data.noaa_gsod.gsod19* 的表

在做这些查询之前我没有做 RTFM。:D

于 2017-11-06T07:42:42.947 回答