Можно ли заставить BigQuery использовать предикатное нажатие при выполнении широковещательного соединения?Возможно, было бы неправильно называть это «предикатным нажатием», идея состоит в том, что BQ не должен «материализовывать» полную строку из «большой» таблицы перед проверкой наличия соответствующих данных в широковещательных данных.
Если я выполняю SELECT из большой таблицы с большим количеством столбцов (700+) с простым условием фильтрации, и условие заставляет его найти только несколько строк, запрос выполняется быстро, и я вижу, чтоусловие фильтрации используется на шаге ЧТЕНИЕ.Я принимаю это, поскольку BQ проверяет условие ПЕРЕД материализацией каждой строки.
Теперь, если я делаю фильтрацию из той же большой таблицы, используя соединение, например, с таблицей небольших размеров, в основном применяя подобное условие фильтрации, но сУсловие, поступающее через широковещательное соединение, запрос становится намного медленнее и использует гораздо больше времени слота.В деталях выполнения он показывает, что сначала он выполняет шаги READ для обеих сторон соединения, а затем выполняет широковещательное соединение.Есть ли способ заставить это сделать предикатное нажатие в этом сценарии?Должен ли я подать запрос функции для этого?
Быстрый запрос с простым предикатом:
SELECT *
FROM `sales`
WHERE
sales_date = '2018-12-01' -- partition pruning condition
AND phone_number = '5552859865' -- lookup by phone number
LIMIT 10
Медленный запрос с тем же предикатом, поступающим через широковещательное соединение.Это не реальный запрос, он создан просто для демонстрации проблемы.Если условие «если» опущено, BQ понимает, что может использовать константу, и использует предикат pushdown.
SELECT t.*
FROM (
SELECT if(tran_num is null, '555', '5552859865') as phone_number
FROM `sales`
WHERE sales_date = '2018-12-01'
LIMIT 1) t0
JOIN `sales` t USING (phone_number)
WHERE sales_date = '2018-12-01'
LIMIT 1000