【问题标题】:SQL - Can I make use of a partition when checking the partitioned field against value from another table?SQL - 在检查分区字段与另一个表中的值时,我可以使用分区吗?
【发布时间】:2025-12-24 14:10:12
【问题描述】:

我正在 Athena SQL 中查询以下用例:

我有一个按日期分区的表 A: 日期 |购买次数 |类别

在另一个表 B 中,我有 500 个事件发生在特定日期。我想在每个事件发生前一周从 A 访问聚合数据: 事件ID |事件_日期 | 7_Days_Before_Event_Date |类别

对于每个事件,我想最终得到事件发生日期前 7 天的购买总和。

但是,当为此使用 where 子句时,例如。 A.Date between B.7_Days_Before_Event_Date and B.Event_Date A 上的分区不再使用,所有数据都被查询,大大降低了性能。

如何在使用分区并因此保持高性能的同时获取每个事件前一周的数据?

SQL 查询:

select b.event_id, sum(a.number_of_purchases)
from dbo.tableA a
inner join dbo.tableB b on a.category = b.category
where a.date between b.7_days_before_event_date and b.event_date
group by b.event_id

【问题讨论】:

  • 你能用 SQL 查询更新你的问题吗?
  • 嗨@PrabhakarReddy,绝对是,刚刚更新

标签: sql performance amazon-athena partition


【解决方案1】:

Athena 基于 presto 并且在 presto 中,您的查询尝试动态生成 between b.7_days_before_event_date and b.event_date 子句的值,并且该值在计划时间之前未知,因此您的查询最终会扫描所有分区。

社区已经在开发一个名为 dynamic filtering 的功能,这将有助于解决此类与性能相关的问题。

您也可以参考link,其中详细讨论了此问题以及可能的解决方法。

【讨论】:

    最近更新 更多