Таблица подстановочных знаков совпадает с _TABLE_SUFFIX и подзапросом - PullRequest
1 голос
/ 22 марта 2019

Функция _TABLE_SUFFIX великолепна и именно то, что я искал, чтобы решить мою проблему - однако она сканирует все данные, совпадающие с подстановочным знаком, когда я использую подзапрос, чтобы определить, какие таблицы сопоставлять.

Если вы выполняете такую ​​операцию, как = или BETWEEN или IN с набором значений в _TABLE_SUFFIX, вы можете увидеть, что объем сканируемых данных уменьшается по сравнению с простым подстановочным знаком:

SELECT sample_data FROM `test.dataset.*` WHERE _TABLE_SUFFIX IN ("NWD1","NWD2","NWD3","NWD4","NWD5") -Отсканировано 1,8 ГБ

Однако, если я сделаю следующее:

SELECT sample_data FROM `test.dataset.*` WHERE _TABLE_SUFFIX IN (SELECT ID FROM subset) - отсканировано 50 ГБ (этот суб-выбор содержит те же значения, что указаны в явном предложении IN)

Ответы [ 3 ]

2 голосов
/ 23 марта 2019

Фильтры констант на _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 ГБ вместо 10 ГБ

1 голос
/ 22 марта 2019

Возможно, лучшее, что вы можете сделать, это сгенерировать предложение IN с помощью запроса, подобного приведенному ниже, а затем сформировать другой запрос с сгенерированным предложением IN:

select concat('IN ("', string_agg(ID, '", "'), '")') as in_clause 
from subset;
0 голосов
/ 23 марта 2019

Это не относится к подзапросам как таковым - если ограничивающие данные находятся в запросе, все нормально - даже при использовании подзапросов:

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!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...