【发布时间】:2019-07-07 06:15:25
【问题描述】:
我想知道是否有办法在 AWS Athena(托管 presto)上使用 SEMI JOIN。 我想尝试减少扫描的数据/提高查询性能。
在我的情况下,我知道联接的一侧恰好有一行,我想是否有办法指导引擎...
【问题讨论】:
标签: sql amazon-web-services presto amazon-athena
我想知道是否有办法在 AWS Athena(托管 presto)上使用 SEMI JOIN。 我想尝试减少扫描的数据/提高查询性能。
在我的情况下,我知道联接的一侧恰好有一行,我想是否有办法指导引擎...
【问题讨论】:
标签: sql amazon-web-services presto amazon-athena
如果您发布一个您想要实现的目标以及它如何扫描太多的示例,将会很有帮助。您的问题非常广泛且难以回答。
如果我对您的理解正确,我认为您可以通过执行以下操作来实现您所指的:
SELECT *
FROM table1
WHERE something IN (SELECT something FROM table2 WHERE col1 = 'the thing' LIMIT 1)
但它是否会减少扫描的数据量取决于您的具体情况。上面查询背后的想法是,它确保 Athena 仅扫描 table2 直到找到您要加入的特定行。如果您不走运,它仍然会扫描整个表,因为它找不到值,或者值在末尾。
您也可以使用… WHERE EXISTS (SELECT …,但根据this Presto issue,它被转换为连接,可能意味着读取整个表——尽管LIMIT可能并非如此。
【讨论】:
IN 和 EXISTS 都使用连接算法的变体执行,并且两个源表都被完全扫描。正在开发的将改善这种情况的功能包括:后期数据物化,允许通过 SEMI JOIN (github.com/prestosql/presto/issues/49) 和动态过滤 (github.com/prestosql/presto/issues/52) 在表扫描阶段过滤数据。