Использование полей разделения и кластеризации в Google BigQuery - PullRequest
0 голосов
/ 13 ноября 2018

Я работаю с некоторыми историческими данными CRM для нескольких клиентов.Моя схема BigQuery организована так, чтобы она имела следующий формат:

PARTITION_MONTH (DATE) | CLIENT_UUID (STR) | PDATE (Date) | ...

Я делаю поле моего раздела с месячной гранулярностью путем усечения PDATE, чтобы компенсировать текущий предел раздела 4K BQ.Кроме того, я установил CLIENT_UUID в качестве кластерного поля для ускорения запросов, специфичных для клиента.Проведя сравнительный анализ, я заметил, что PARTITION_MONTH не влияет на количество сканируемых байтов.

Клиент, с которым я тестировал, составляет 37% записей в моей таблице.У меня есть три таблицы (идентичные данные), где в одной есть разделение / кластеризация, кластеризация со всеми разделами, установленными в NULL, и нет разделения / кластеризация.Простая агрегированная сумма в кластеризованных таблицах показывает, что кластеризация CLIENT_UUID работает:

SELECT SUM(amount) FROM dataset.table WHERE CLIENT_UUID='myclient'

Non-Partitioned:       513 MB processed
Clustered:             191 MB processed (~37% of non-partitioned)
Partitioned/Clustered: 191 MB processed

Однако, когда я включаю дату в запрос, поле секционирования не показывает увеличения производительности:

SELECT SUM(amount) FROM dataset.table
WHERE CLIENT_UUID='myclient'
  AND [PARTITION_MONTH/PDATE] > DATE(2000, 1, 1)

Non-Partitioned:       513 MB processed
Clustered:             191 MB processed (~37% of non-partitioned)
Partitioned/Clustered: 191 MB processed

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

Кто-нибудь может объяснить это поведение?Это вопрос BigQuery или, возможно, то, как я структурирую свои запросы?Любая помощь будет отличной, спасибо.

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