BigQuery. Существует ли ограниченное число строк, через которые можно просмотреть кластерное поле при применении WHERE shop IN (выберите магазин из X)? - PullRequest
1 голос
/ 20 января 2020

В качестве примера:

Скажи, что я взял table_1; разбил его по дням и сгруппировал по shop, и я попытался использовать список shop в table_2 (не кластеризованный или не секционированный) для фильтрации по моему кластерному полю в table_1.

Затем, когда я запрашиваю что-то вроде:

SELECT shop, COUNT(id) count_id
FROM table_1
WHERE shop IN (SELECT shop FROM table_2 ORDER BY shop)
GROUP BY shop

, я получаю полную верхнюю границу 8,9 ГБ обработанной.

Мое время обработки должно быть намного меньше с тех пор; table_1 содержит, скажем, 10 миллионов строк названий магазинов, а table_2 содержит только 2 миллиона этих строк.

Обратите внимание, что когда я запрашиваю что-то вроде:

SELECT shop, COUNT(id) count_id
FROM table_1
WHERE shop IN (SELECT shop FROM table_2 ORDER BY shop LIMIT 10000)
GROUP BY shop

, я обрабатываю как 230 МБ?

во втором запросе; Я ограничиваю свои строки до 10 КБ, что, кажется, работает, но если table_1 содержит 10-метровые строки и table_1 содержит 2-метровые строки, то это уже я сужаю его до 2-х строк максимум, верно?

Моя главная квест здесь такой: есть ли определенный порог для того, сколько моего кластерного поля может сканировать без обработки всей верхней границы?

Надеюсь, что все имело смысл !! Если нет, пожалуйста, дайте мне знать, и я постараюсь объяснить заново.

Спасибо.

1 Ответ

1 голос
/ 22 января 2020

Разница лежит здесь:

WHERE shop IN (SELECT shop FROM table_2 ORDER BY shop LIMIT 1000)

Обычно вам не нужно ORDER BY для операции IN() - но когда вы делаете IN (ORDER BY x LIMIT y) - тогда вы только выбирая первые 1000 магазинов, все с идентификаторами между - скажем - a и d.

Кластеризация отсортировала содержимое вашей основной таблицы по shop - следовательно, этот IN только откроет кластеры, которые содержат магазины между a и d. Экономия затрат!

Но если бы вы сделали что-то вроде:

WHERE shop IN('a','b','c','d',....,'z')

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

Проверьте различия между этими 3 запросами - и обратите внимание, что DISTINCT тоже очень важно:

SELECT *
FROM `fh-bigquery.weather_gsod.all`
WHERE name IN
  ('A', 'C', 'E', 'H', 'J', 'L', 'M', 'O', 'R', 'S') 
LIMIT 10

# 0.5 sec elapsed, 2.6 GB processed
SELECT *
FROM `fh-bigquery.weather_gsod.all`
WHERE name IN
   (SELECT name FROM `fh-bigquery.weather_gsod.all` WHERE name BETWEEN 'A' AND 'C')
LIMIT 10

# 22.5 sec elapsed, 45.6 GB processed
SELECT *
FROM `fh-bigquery.weather_gsod.all`
WHERE name IN
   (SELECT DISTINCT name FROM `fh-bigquery.weather_gsod.all` WHERE name BETWEEN 'A' AND 'C')
LIMIT 10

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