让Athena中有一个外部表格,它指向在s3上以镶木地板格式存储的大量数据。它包含很多列,并在名为“timeid”的字段上进行分区。现在,还有另一个外部表(小表),它将timeid映射到日期。
当较小的表也在timeid上分区并且我们将它们连接到它们的分区ID(timeid)并将日期放入where子句时,只从大表中扫描那些包含与该日期对应的时间标记的特定记录。此处不扫描整个数据。
但是,如果较小的表未在timeid上进行分区,则即使存在日期列上的条件,也会进行完整数据扫描。
即使大分区表与未分区的小表连接,有没有办法避免全数据扫描?这是必需的,因为小表每个timeid只包含一条记录,并且可能不会为每个记录创建单独的文件。
答案 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。