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 拆分字符串
如何使用 Boto3 get_query_results 方法从 AWS Athena 创建数据框