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
上下文
我正在使用 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