Athena:最小化查询扫描的数据,包括JOIN操作

时间:2017-08-02 20:31:55

标签: amazon-web-services join partitioning amazon-athena

让Athena中有一个外部表格,它指向在s3上以镶木地板格式存储的大量数据。它包含很多列,并在名为“timeid”的字段上进行分区。现在,还有另一个外部表(小表),它将timeid映射到日期。

当较小的表也在timeid上分区并且我们将它们连接到它们的分区ID(timeid)并将日期放入where子句时,只从大表中扫描那些包含与该日期对应的时间标记的特定记录。此处不扫描整个数据。

但是,如果较小的表未在timeid上进行分区,则即使存在日期列上的条件,也会进行完整数据扫描。

即使大分区表与未分区的小表连接,有没有办法避免全数据扫描?这是必需的,因为小表每个timeid只包含一条记录,并且可能不会为每个记录创建单独的文件。

1 个答案:

答案 0 :(得分:1)

这是一个有趣的发现!

您可以使用子查询而不是连接来避免大扫描。

而不是:

SELECT ...
FROM large-table
JOIN small-table
WHERE small-table.date > '2017-08-03'

您可以使用:

SELECT ...
FROM large-table
WHERE large-table.date IN
         (SELECT date from small-table
          WHERE date > '2017-08-03')

我没有测试过,但这样可以避免你提到的JOIN。