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 将继续获得一些实质性的更新。
另请注意,今天有两种分区表:
- 按摄取时间分区的表
- 根据 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
我有一个分区 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 将继续获得一些实质性的更新。
另请注意,今天有两种分区表:
- 按摄取时间分区的表
- 根据 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