0

我有一个分区表,并试图将我的搜索限制在几个分区。为此,我正在运行一个查询(使用旧版 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. 为什么会这样?

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

4

2 回答 2

2

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

另请注意,今天有 2 种类型的分区表:

  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”的信息了。

于 2018-07-11T23:47:05.047 回答
2

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

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

于 2018-07-11T23:51:37.483 回答