Короткий ответ
В BigQuery стоимость запроса обычно зависит от объёма прочитанных данных, поэтому главные рычаги — партиционирование таблицы по дате и фильтрация именно по партиционирующему столбцу, кластеризация по часто используемым столбцам фильтра, а также явный выбор нужных столбцов вместо SELECT *.
Как это работает подробнее
Как это работает: BigQuery хранит данные колоночно и по умолчанию тарифицирует запрос по объёму прочитанных байт (в модели on-demand); партиционирование по дате позволяет движку физически пропускать партиции, не попадающие под фильтр WHERE event_date BETWEEN ..., а кластеризация внутри партиции ускоряет и дешевит фильтрацию по дополнительным столбцам (например, user_id, event_type).
Пример кода
BigQuery: чтение только нужных партиций
SELECT user_id, event_type
FROM `project.dataset.events`
WHERE event_date BETWEEN '2024-03-01' AND '2024-03-31'
AND event_type = 'purchase';Что использовать на практике
- На практике: перед запуском дорогого запроса стоит использовать режим предварительной оценки (
dry run/ предпросмотр объёма обрабатываемых байт в интерфейсе), чтобы увидеть стоимость до фактического выполнения. Выбор конкретных столбцов вместоSELECT *в колоночном хранилище особенно важен — ненужные столбцы вообще не читаются с диска, в отличие от строкового хранения. - Проверка: Проверка: сравнить оценку обрабатываемого объёма (через dry run) для этого запроса и для его варианта без фильтра по
event_dateна полную таблицу — разница должна быть многократной при партиционировании поevent_date.
Подводные камни
- Частые ошибки: фильтруют по дате через выражение, скрывающее партиционирующий столбец (например,
CAST(event_timestamp AS DATE) = '2024-03-01'вместо прямого сравнения с партиционирующим полем), из-за чего движок не может применить partition pruning и читает все партиции целиком, несмотря на внешне «правильный» фильтр.