我正在努力理解分区和谓词下推之间的关系。想象一下,我们使用AWS Athena处理存储在S3中的Parquet格式的数据。数据集由date
和type
列进行分区。它还包含一个subtype
列,如果type
等于X,则该列始终为NULL。
我正在尝试执行下面的查询
SELECT date, type, subtype FROM tablename WHERE date = '01012001' AND subtype IS NOT NULL;
查询扫描的数据量与相同
SELECT date, type, subtype FROM tablename WHERE date = '01012001' AND type <> X AND subtype IS NOT NULL;
然而,后一种查询明显更快(约30%)
我正试图了解幕后发生了什么。我的猜测是,在第二种情况下,执行器只扫描具有给定类型和日期的分区,而在第一种情况中,它试图扫描所有满足日期要求的文件,无论其类型如何。即使跳过了具有NULL子类型的记录,实际查询成本也是一样的,但这也需要更多的时间。
如果有人能验证我的猜测,如果是错误的,请纠正,我将不胜感激。
您提到数据在date
和type
上进行分区。
在WHERE date = '01012001' AND type <> X AND subtype IS NOT NULL
类型的查询中,Presto(Athena)将只需要访问相关文件。
在WHERE date = '01012001' AND subtype IS NOT NULL
类型的查询中,Presto将访问给定date
(所有type
值)的所有文件。由于Parquet文件的元数据中存储了信息,因此可以跳过不包含subtype
的非NULL
值的文件。然而,获取元数据仍然需要时间,因为访问存储时会涉及延迟(S3)。