Athena Query - “NOT IN” 性能缓慢

Posted

技术标签:

【中文标题】Athena Query - “NOT IN” 性能缓慢【英文标题】:Athena Query - "NOT IN" slow performance 【发布时间】:2022-01-09 21:57:27 【问题描述】:

上下文

我正在使用 Athena 构建查询,我注意到使用“NOT IN”对查询的运行时间产生了重大影响。该查询在两个表之间执行连接,旨在通过排除一组 id 来过滤结果的行。

id 不是唯一的。它可能会出现在多行中。本质上,我编写了子查询,因为如果行满足子查询中的条件,我想忽略任何/所有具有给定 id 值的行。

换句话说,对于在数据库中有 5 行的给定 ID“24324”,如果任何单个行的值满足子查询中的条件,我们希望过滤掉所有行。

我的问题

有没有更有效的方法来构建这个查询,我没有考虑过减少运行时间?

查询

表名和列名已使用占位符/通用值进行了清理。

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)

【讨论】:

谢谢 :) 在这种情况下,您的建议是否仍不会引入与给定 id 关联的符合条件的行?本质上,如果给定 id 的任何行满足条件,则该 id 的所有行都需要删除。 同意。我错过了第二点。尝试使用存在子句(上面更新) 谢谢!我可以确认这是可行的,不利的一面是它非常慢。当然,这取决于我正在使用的数据库的大小,但我很好奇您是否有任何效率建议?如果不是,我会接受这个答案,因为它确实回答了这个问题。【参考方案2】:

也许您可以使用分析总和/计数标记非唯一 ID,然后过滤此标记列。

SELECT * FROM
    (
    SELECT
        nonunique_id,
        col2,
        col3,
        col4,
        ...
        SUM(CASE WHEN (row_condition = TRUE) THEN 1 ELSE 0 END)
            OVER (PARTITION BY nonunique_id) exclude_flag
    FROM Table_A a
        JOIN Table_B
    ...
    )
WHERE
    exclude_flag = 0

【讨论】:

以上是关于Athena Query - “NOT IN” 性能缓慢的主要内容,如果未能解决你的问题,请参考以下文章

用于 In Query 的 Athena/Presto 拆分字符串

ef not in

如何使用 Boto3 get_query_results 方法从 AWS Athena 创建数据框

PowerBI Folding on Native Query 基于 AWS Athena 查询-增量刷新

优化 MySQL NOT IN( 查询

Yii2 : Active Record add Not In condition