我试图了解分区和谓词下推之间的关系。想象一下,我们正在使用AWS Athena处理以Parquet格式存储在S3中的数据。数据集由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子类型的记录,这也需要更多时间,实际查询成本是相同的。
如果有人可以验证我的猜测,并且如果错误的话,请更正。
答案 0 :(得分:1)
您提到数据在date
和type
上分区。
在WHERE date = '01012001' AND type <> X AND subtype IS NOT NULL
类型的查询中,Presto(雅典娜)将仅需要访问相关文件。
在WHERE date = '01012001' AND subtype IS NOT NULL
类查询中,Presto将访问给定date
的所有文件(对于所有type
值)。由于存储在Parquet文件的元数据中的信息,可以跳过文件,因为它不包含NULL
的非subtype
值。但是,获取元数据仍然需要时间,因为访问存储(S3)时会出现延迟。