通配符表与_TABLE_SUFFIX和子查询匹配

时间:2019-03-22 20:22:29

标签: google-bigquery

_TABLE_SUFFIX功能很棒,正是我要解决的问题-但是,当我使用子查询来确定要匹配的表时,它将扫描通配符匹配的所有数据。

如果使用_TABLE_SUFFIX上的一组值执行=或BETWEEN或IN之类的操作,则与仅使用通配符相比,可以看到扫描的数据量有所下降:

SELECT sample_data FROM `test.dataset.*` WHERE _TABLE_SUFFIX IN ("NWD1","NWD2","NWD3","NWD4","NWD5")-扫描了1.8 GB

但是,如果我执行以下操作:

SELECT sample_data FROM `test.dataset.*` WHERE _TABLE_SUFFIX IN (SELECT ID FROM subset)-扫描了50GB(此子选择包含的值与显式IN子句中显示的值相同)

3 个答案:

答案 0 :(得分:2)

_TABLE_SUFFIX上的常量过滤器将减少查询的数据量,但如果这些过滤器来自动态子查询则不会。

作为替代方案-您是否考虑过集群存储?

即使使用动态子查询进行过滤,聚簇表也可以优化查询的数据量。

SELECT sample_data FROM `test.dataset.*`
  WHERE clustered_column IN (SELECT ID FROM subset)

会工作的。

例如

SELECT MAX(title), wiki
FROM `fh-bigquery.wikipedia_v3.pageviews_2018` 
WHERE DATE(datehour) = '2018-01-10'
AND wiki IN (
  SELECT wiki 
  FROM  `fh-bigquery.wikipedia_v3.pageviews_2018`   
  WHERE  DATE(datehour) = '2018-01-01'
  AND NOT wiki LIKE 'e%'
  LIMIT 3
)
GROUP BY 2 

查询0.341 GB,而不是10 GB

答案 1 :(得分:1)

也许最好的办法是使用如下查询生成IN子句,然后使用生成的IN子句形成另一个查询:

select concat('IN ("', string_agg(ID, '", "'), '")') as in_clause 
from subset;

答案 2 :(得分:0)

这与子查询本身无关-如果限制数据位于查询中就可以了-即使使用子查询也是如此:

CREATE TEMP FUNCTION daterange(suf string) as ( suf between '04' and '06');

WITH vars AS (
  SELECT
    '04' as startDate,
    '06' as endDate,
    ['04', '05', '06'] as daterange
  )

SELECT 
  *
FROM
    `bigquery-public-data.google_analytics_sample.ga_sessions_201611*` t -- 513.6
WHERE 
  _TABLE_SUFFIX between '04' and '06' -- 39.4
  --(select _table_suffix between startDate and endDate from vars) -- 39.4
  --daterange(_table_suffix) -- 39.4
  --_table_suffix in unnest( (select daterange from vars) ) -- 39.4

hth!