Разница лежит здесь:
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