Как я могу улучшить объем данных, запрашиваемых с помощью многораздельной + кластеризованной таблицы?

У меня есть таблица BigQuery - дневная секционированная и сгруппированная. Однако, когда я выполняю запросы, он по-прежнему использует много данных. Как это возможно?


person Felipe Hoffa    schedule 30.09.2019    source источник


Ответы (1)


Иногда никакие разделы или еженедельные / ежемесячные / ежегодные разделы будут работать лучше, чем ежедневная секционированная таблица + кластеризация.

Это потому, что каждый кластер данных в BigQuery имеет минимальный размер. Если каждый день данных в ежедневной многораздельной таблице содержит меньше этого количества данных, вы не увидите никаких преимуществ от кластеризации таблицы.

Например, давайте создадим таблицу с погодой за 30+ лет. Я разделю эту таблицу по месяцам (чтобы уместить несколько лет в одну таблицу):

CREATE TABLE `temp.gsod_partitioned`
PARTITION BY date_month
CLUSTER BY name
AS 
SELECT *, DATE_TRUNC(date, MONTH) date_month
FROM `fh-bigquery.weather_gsod.all` 

Теперь давайте запустим запрос по нему - используя поле кластеризации name:

SELECT name, state, ARRAY_AGG(STRUCT(date,temp) ORDER BY temp DESC LIMIT 5) top_hot, MAX(date) active_until
FROM `temp.gsod_partitioned`
WHERE name LIKE 'SAN FRANC%'
AND date > '1980-01-01'
GROUP BY 1,2
ORDER BY active_until DESC 
# (2.3 sec elapsed, 3.1 GB processed)

Теперь давайте сделаем это над идентичной таблицей - разделенной по фальшивой дате (так что на самом деле никакого разделения) и сгруппированы по одному и тому же столбцу:

SELECT name, state, ARRAY_AGG(STRUCT(date,temp) ORDER BY temp DESC LIMIT 5) top_hot, MAX(date) active_until
FROM `fh-bigquery.weather_gsod.all` 
WHERE name LIKE 'SAN FRANC%'
AND date > '1980-01-01'
GROUP BY 1,2
ORDER BY active_until DESC
# (1.5 sec elapsed, 62.8 MB processed)

Было обработано всего 62,8 МБ данных (против 3,1 ГБ)!

Это связано с тем, что кластеризация без разделов намного эффективнее для таблиц, у которых не много ГБ в день.

Бонус: сгруппировано по гео:

SELECT name, state, ARRAY_AGG(STRUCT(date,temp) ORDER BY temp DESC LIMIT 5) top_hot, MAX(date) active_until  
FROM `fh-bigquery.weather_gsod.all_geoclustered`  
WHERE date > '1980-01-01'
AND ST_DISTANCE(point_gis, ST_GEOGPOINT(-122.465, 37.807)) < 40000
GROUP BY 1,2
ORDER BY ST_DISTANCE(ANY_VALUE(point_gis), ST_GEOGPOINT(-122.465, 37.807))
# (2.1 sec elapsed, 100.7 MB processed)
person Felipe Hoffa    schedule 30.09.2019