有一张镶木地板数据格式为20 GB的表,简单查询将仅扫描1GB数据即可得出结果。
select columns from table1 where id in (id1, id2, idn)
如果使用子查询(例如-)执行相同的查询
select columns from table1 where id in (select id from table2 limit n)
该查询将通过扫描整个表20GB来给出结果。即使n是非常小的数字,例如10、50或5000。
LEFT JOIN也是如此。
SELECT table1.* FROM
table2 LEFT JOIN table1
ON table2.id=table1.id
是否有一种方法可以通过运行单个查询而不是获取并保存子查询的结果并将其作为args传递到另一个查询中来实现? 当前用户如何在Athena上不进行全表扫描的情况下运行LEFT JOIN或子查询的任何最佳做法?
相似的问题-Question -1,Question -2
答案 0 :(得分:1)
是否有一种方法可以通过运行单个查询而不是获取并保存子查询的结果并将其作为args传递到另一个查询中来实现?
最常见的是“动态过滤”。 目前尚无办法。
Athena基于Presto,并且Presto还不支持动态过滤,但可能会在下一个版本(Presto 321)中支持它。您可以在此处跟踪问题:https://github.com/prestosql/presto/issues/52