【问题标题】:Google Big Query charges for querying full table if subquery used如果使用子查询,Google Big Query 会收取查询全表的费用
【发布时间】:2018-07-11 23:36:29
【问题描述】:

我有一个分区表,并试图将我的搜索限制在几个分区。为此,我正在运行一个查询(使用旧版 SQL),如下所示:

SELECT
  *
FROM
  [project:dataset.table]
WHERE
  _PARTITIONTIME >= "2018-07-10 00:00:00"
  AND _PARTITIONTIME < "2018-07-11 00:00:00"
  AND col IN (
  SELECT
    col
  FROM
    [project:dataset.table]
  WHERE
    _PARTITIONTIME >= "2018-07-10 00:00:00"
    AND _PARTITIONTIME < "2018-07-11 00:00:00"
    AND col2 > 0)

我使用_PARTITIONTIME 限制主查询和子查询,所以大查询应该只需要搜索那些分区。当我运行此查询时,虽然我被计费,就好像我只是在不使用_PARTITIONTIME 的情况下查询了整个表一样。为什么会这样?

更新 使用标准 SQL 的等效查询没有此问题,因此使用它作为解决方法。我仍然想知道为什么会发生这种情况。如果这只是一个错误,或者如果旧版 SQL 实际上确实尝试访问表中的所有数据以进行这样的查询。

【问题讨论】:

    标签: google-bigquery billing legacy-sql


    【解决方案1】:

    如问题中所述,切换到#standardSQL 是正确的解决方案。您不应该期望对旧版 SQL 方言有任何重大更新 - 而#standardSQL 将继续获得一些实质性的更新。

    还要注意今天有两种类型的分区表:

    1. 按摄取时间分区的表
    2. 基于 TIMESTAMP 或 DATE 列分区的表

    如果您尝试使用旧版 SQL 查询第二种类型:

    SELECT COUNT(*)
    FROM [fh-bigquery:wikipedia_v2.pageviews_2018]
    WHERE datehour BETWEEN "2018-01-01 00:00:00" AND "2018-01-02 00:00:00" 
    

    您收到错误“在旧版 SQL 中不支持查询在字段上分区的表”。

    同时这有效:

    #standardSQL
    SELECT COUNT(*)
    FROM `fh-bigquery.wikipedia_v2.pageviews_2018`
    WHERE datehour BETWEEN "2018-01-01 00:00:00" AND "2018-01-02 00:00:00" 
    

    我添加这些要点是为了强化“是时候改用#standardSQL 以充分利用 BigQuery”的信息了。

    【讨论】:

      【解决方案2】:

      我认为这是 BigQuery Legacy SQL 特有的问题。

      Pseudo column queries scan all partitions 有一个案例列表,并且明确提到了 Legacy SQL - In legacy SQL, the _PARTITIONTIME filter works only when ...
      我在该列表中看不到您的确切情况 - 但最好的方法是在这里使用标准 SQL

      【讨论】:

        猜你喜欢
        • 2021-05-02
        • 2019-06-18
        • 2012-10-21
        • 2014-01-15
        • 2021-04-16
        • 1970-01-01
        • 2018-09-12
        • 2018-01-08
        • 2021-01-31
        相关资源
        最近更新 更多