Странно большой размер обработки в запросе BigQuery для секционированной таблицы

#google-bigquery

#google-bigquery

Вопрос:

Я только что заметил некоторое странное поведение размера обработки при выполнении запросов BigQuery для таблицы с разделением на временные метки. У нас есть таблица с примерно 70 устройствами, передающими вставки один раз в минуту, так что около 70 вставок в минуту или 4200 вставок в час. Показать небольшой пример — самый простой способ описать проблему. В пользовательском интерфейсе BigQuery на GCP, если я запрашиваю данные за один день:

 select * from dataset.table where DATE(time) = '2020-09-21';
  

в нем говорится

Этот запрос обработает 3,2 ГБ при запуске.

Однако, если я запрашиваю данные за 7 дней:

 select * from dataset.table where DATE(time) >= '2020-09-15' and DATE(time) <= '2020-09-21';
  

в нем говорится

Этот запрос будет обрабатывать 3,3 ГБ при запуске.

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

Что еще более странно, так это то, что это дополнительное пространство, похоже, растет экспоненциально с размером таблицы. В качестве примера я создал новую таблицу, содержащую только 10 из 70 устройств, и добавил данные за несколько месяцев с этих устройств. Когда я выполнил эти запросы, я обнаружил, что запрос обработал 1,4 МБ для запроса за 1 день и 8,9 МБ для запроса за 7 дней, что составляет увеличение примерно на 1,07 МБ / день, что означает, что этот «дополнительный размер» составляет всего около 33 КБ, или примерно в 2300 раз меньше, чемтаблица со всеми устройствами.

Итак, мой вопрос в том, что это за большой дополнительный размер обработки и почему он там? Должно быть что-то, связанное с потоковыми вставками или кэшированием, или что-то, чего мне не хватает?

Комментарии:

1. у вас также есть поле кластеризации в этой таблице?

2. Может быть, глупый вопрос, но вы уверены, что ваша таблица разделена на time поле, а не на _PARTITIONTIME псевдополе? Похоже, что ваш запрос не использует преимущества разделов, поэтому я мог видеть, что это одна из причин.

3. @MikhailBerlyant Кластеризации нет, но я нашел кое-что интригующее в документации Google по кластеризации. «В секционированной таблице данные хранятся в физических блоках, каждый из которых содержит один раздел данных. … Это требует, чтобы BigQuery поддерживал больше метаданных, чем для неразделенной таблицы. По мере увеличения количества разделов увеличивается объем накладных расходов на метаданные. » У нас есть данные почти за 3 года, так что ~ 1000 разделов.

4. @rtenha Да, он разделен на наш столбец «время» и проверяется в пользовательском интерфейсе. Кроме того, объем обрабатываемых данных увеличивается с увеличением количества запрошенных дней.