【问题标题】:Athena Query - "NOT IN" slow performanceAthena Query - “NOT IN” 性能缓慢
【发布时间】: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)

【问题讨论】:

    标签: sql amazon-web-services amazon-athena presto


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2021-11-03
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 2015-01-27
      • 2021-06-04
      • 2016-11-09
      • 2021-06-21
      相关资源
      最近更新 更多