Athena 查询 - "NOT IN" 性能低下

Athena Query - "NOT IN" slow performance

上下文

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

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

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

我的问题

是否有更有效的方法来构造此查询,我没有考虑过减少运行时间?

查询

Table 和列名称已使用 placeholder/generic 值进行了清理。

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)

在连接条件期间过滤空记录。它将首先带来较少的记录以加入条件。 这将有助于提高性能,尝试优化连接。左边更大的table,加入右边更小的table将有助于提高性能。

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 sum/count,然后过滤此标记列。

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