Запрос Афины — «НЕ В» медленной производительности

#sql #amazon-web-services #amazon-athena #presto

#sql #amazon-веб-сервисы #амазонка-афина #presto

Вопрос:

Контекст

Я создаю запрос с помощью Athena и отметил, что использование «НЕ В» оказало значительное влияние на время выполнения запроса. Запрос выполняет соединение между двумя таблицами и направлен на фильтрацию строк результата путем исключения набора идентификаторов.

Идентификатор НЕ является уникальным. Возможно, он будет присутствовать в нескольких строках. По сути, я написал подзапрос, так как хочу игнорировать ЛЮБЫЕ/ВСЕ строки с заданным значением идентификатора, если строки соответствуют условию в подзапросе.

Другими словами, для данного идентификатора «24324», который содержит 5 строк в базе данных, мы хотим отфильтровать ВСЕ строки, если КАКОЕ-либо из значений отдельных строк соответствует условиям подзапроса.

Мой вопрос

Есть ли более эффективный способ структурировать этот запрос, который я не рассматривал для сокращения времени выполнения?

Запрос

Имена таблиц и столбцов были очищены с помощью заполнителей/общих значений.

 SELECT * FROM table_a INNER JOIN table_b ON table_b.external_id = table_a.external_id   AND table_b.client_name = table_a.client -- These are the ids we do not want in the final result. WHERE table_b.id NOT IN (SELECT distinct(table_b.id)  FROM table_b  WHERE table_b.decision IS NOT NULL   OR table_b.submission_time IS NOT NULL)  

Ответ №1:

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

 SELECT * FROM table_a INNER JOIN table_b ON table_b.external_id = table_a.external_id   AND table_b.client_name = table_a.client WHERE NOT EXISTS (SELECT 1  FROM table_bb  WHERE (table_bb.decision IS NOT NULL   OR table_bb.submission_time IS NOT NULL)  and table_b.id = table_bb.id)  

Комментарии:

1. Спасибо 🙂 В этом случае не будет ли ваше предложение по-прежнему приводить строки, связанные с данным идентификатором, которые соответствуют условиям? По сути, если КАКАЯ-либо из строк для данного идентификатора соответствует условиям, ВСЕ строки для этого идентификатора должны быть удалены.

2. Соглашаться. Я пропустил этот второй момент. Попробуйте использовать предложение exists (обновлено выше)

3. Спасибо! Я могу подтвердить, что это работает, с другой стороны, это ОЧЕНЬ медленно. Конечно, это зависит от размера баз данных, с которыми я работаю, но мне любопытно, есть ли у вас какие-либо предложения по эффективности? Если нет, я приму ответ, поскольку он действительно отвечает на вопрос.