Я пытаюсь понять связь между разделением и предикатом pushdown.Представьте, что мы используем AWS Athena для работы с данными, хранящимися в S3 в формате Parquet.Набор данных разделен на столбцы date
и type
.Он также содержит столбец subtype
, который всегда равен NULL, если type
равен X.
Я пытаюсь выполнить запрос ниже
SELECT date, type, subtype FROM tablename WHERE date = '01012001' AND subtype IS NOT NULL;
Запрос сканирует тот же объем данных, что и
SELECT date, type, subtype FROM tablename WHERE date = '01012001' AND type <> X AND subtype IS NOT NULL;
Однако последний запрос выполняется значительно быстрее (около 30%)
Я пытаюсьпонять что происходит под капотом.Я предполагаю, что во втором случае исполнитель сканирует только те разделы, которые имеют заданный тип и дату, тогда как в первом случае он пытается сканировать все файлы, удовлетворяющие требованию даты, независимо от их типа.Это требует больше времени, даже если записи с подтипом NULL пропускаются, фактическая стоимость запроса остается той же.
Если бы кто-то мог проверить мои предположения и, если они ошибочны, исправить это, я был бы очень признателен.