Google 如果使用子查询,查询完整 table 的 Big Query 费用

Google Big Query charges for querying full table if subquery used

我有一个分区 table,我试图将我的搜索限制在几个分区内。为此,我正在 运行 查询(使用旧版 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限制了主查询和子查询,所以大查询应该只需要搜索那些分区。当我 运行 这个查询时,我被计费,就好像我只是查询了整个 table 而没有使用 _PARTITIONTIME。为什么会这样?

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

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

另请注意,今天有两种分区表:

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

如果您尝试使用 legacy 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" 

您收到错误 "Querying tables partitioned on a field is not supported in Legacy 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" 

我添加这些要点以增强消息 "it's time to switch to #standardSQL to get the best out of BigQuery"。

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

有一个案例列表 Pseudo column queries scan all partitions 并且明确提到旧版 SQL - In legacy SQL, the _PARTITIONTIME filter works only when ...
我在该列表中看不到你的情况 - 但最好的方法是在此处使用 Standard SQL