如果使用了子查询,则Google Big Query会收取查询全表的费用

时间:2018-07-11 23:36:29

标签: google-bigquery billing legacy-sql

我有一个分区表,正在尝试将搜索范围限制为几个分区。为此,我正在运行一个查询(使用旧版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确实确实尝试访问表中的所有数据以进行此类查询。

2 个答案:

答案 0 :(得分:2)

如问题中所述,切换到#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了”。

答案 1 :(得分:2)

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

列出了Pseudo column queries scan all partitions时的情况,并且明确提到了旧版SQL-In legacy SQL, the _PARTITIONTIME filter works only when ...
我在列表中看不到您的情况-最好的方法是在此处使用标准SQL