Есть ли разница в производительности для применения условия where к источнику данных подзапроса по сравнению с его применением в объединенном операторе? Есть ли разница между ними в производительности?
Допустим, у меня есть две таблицы кустов A и B, которые разделены по дате поля.
WITH table_A AS (
SELECT date, some_info FROM some_table WHERE date = '2020-12-11'
),
table_B AS (
SELECT date, some_other_info FROM some_other_table WHERE date = '2020-12-11'
)
SELECT table_A.*, table_B.some_other_info FROM table_A INNER JOIN table_B
Является ли производительность этого запроса такой же, как и следующая?
WITH table_A AS (
SELECT table_A, some_info FROM some_table
),
table_B AS (
SELECT date, some_other_info FROM some_other_table
)
SELECT table_A.*, table_B.some_other_info FROM table_A INNER JOIN table_B WHERE table_A.date = '2020-12-11'
Просто игрушечный пример, чтобы продемонстрировать вопрос. Вы правы, что CTE необходимы в этом конкретном примере.
CTE в Hive постепенно улучшались с момента их появления, поэтому я думаю, что ответ будет зависеть от вашей версии Hive.
Ответ: это зависит. Тем не менее, я сторонник того, чтобы фильтровать как можно раньше в процессе обработки. Как правило, это не может повредить.
От чего это зависит? Ну что, CTE материализовался? То есть сохраняется в промежуточную "таблицу"? Это, увы, управляется настройкой hive.optimize.cte.materialize.threshold
. Если CTE материализуется, то вы определенно хотите, чтобы он отфильтровывался в CTE>
С другой стороны, при материализации может быть потеряна другая полезная информация об исходных данных, например схемы разделения. Итак, еще раз, это зависит.
Я действительно думаю, что CTE, на который ссылаются только один раз, не материализуется с настройками по умолчанию. Так что в данном контексте это не имеет значения.
Почему вы вообще используете CTE для этого запроса?