Я работаю с некоторыми историческими данными 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 или, возможно, то, как я структурирую свои запросы?Любая помощь будет отличной, спасибо.