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