Подзапрос в секционированных таблицах Athena

Я использую разделы в Athena. У меня есть раздел с именем моментальный снимок, и когда я вызываю запрос как таковой:

select * from mytable where snapshot = '2020-06-25'

Затем, как и ожидалось, сканируется только указанный раздел, и мой запрос выполняется быстро. Однако, если я использую подзапрос, который возвращает одну дату, это медленно:

select * from mytable where snapshot = (select '2020-06-25')

Вышеупомянутое фактически сканирует все разделы, а не только указанную дату, и приводит к очень низкой производительности.

Мой вопрос: могу ли я использовать подзапрос для указания разделов и повышения производительности. Мне нужно использовать подзапрос, чтобы добавить некоторую пользовательскую логику, которая возвращает дату на основе некоторых критериев.


person Gerges    schedule 25.06.2020    source источник
comment
Очевидно нет. Если этот подзапрос не работает, трудно представить другой, который работает. Я думаю, что идея состоит в том, чтобы запустить подзапрос, но в результате получается какая-то переменная и используется для генерации SQL.   -  person Gordon Linoff    schedule 26.06.2020
comment
вы можете использовать API Athena (например, boto3 для Python) для запроса и получения даты из пользовательской логики и использования ее в последующем вызове запроса.   -  person Vamsi Prabhala    schedule 26.06.2020
comment
Пожалуйста, проверьте также where snapshot IN (select '2020-06-25') работает ли полное сканирование так же?   -  person leftjoin    schedule 26.06.2020
comment
@leftjoin Да, IN и = имеют одинаковый эффект.   -  person Gerges    schedule 26.06.2020
comment
@VamsiPrabhala Спасибо, да, это решение, к которому я сейчас склоняюсь, если только у меня не будет возможности сделать все это в sql.   -  person Gerges    schedule 26.06.2020


Ответы (1)


Редактировать:

Trino 356 может встраивать такие запросы, см. https://github.com/trinodb/trino/issues/4231#issuecomment-845733371

Старый ответ:

Presto по-прежнему не встраивает тривиальные подзапросы, такие как (select '2020-06-25'). Это отслеживается https://github.com/trinodb/trino/issues/4231. Таким образом, вы не должны ожидать, что Athena будет встроена, так как она основана на Presto .172.

Мне нужно использовать подзапрос, чтобы добавить некоторую пользовательскую логику, которая возвращает дату на основе некоторых критериев.

Если ваш запрос будет более сложным, а не постоянным выражением, он все равно не будет встроен. Если snapshot является ключом раздела, вы можете использовать недавно добавленную функцию — динамическое сокращение раздела. Подробнее читайте на странице https://trino.io/blog/2020/06/14/dynamic-partition-pruning.html. Это, конечно, предполагает, что вы можете выбрать версию Presto.

Если вы ограничены Athena, ваш единственный вариант — оценить подзапрос вне основного запроса (отдельно) и передать его обратно в основной запрос как константу (например, литерал).

person Piotr Findeisen    schedule 25.06.2020