【问题标题】:How to tune this Amazon Athena SQL query that already uses Parquet files如何调整这个已经使用 Parquet 文件的 Amazon Athena SQL 查询
【发布时间】:2020-08-03 17:28:31
【问题描述】:

我在 S3 中有一些巨大的数据文件,我正在尝试使用 Athena 运行它们。现在查询大约需要一分钟,但扫描的数据以 TB 为单位。

有什么方法可以减少要扫描的数据。

我们尝试了什么:我们已经在尝试使用 parquet 格式压缩 S3 中的底层文件以节省成本。

我们只选择我们需要的列。有什么可以在查询级别完成的吗?

查询:

SELECT * 
FROM  
    (SELECT 
         A.roll_no, A.name, 
         C.desc, 
         B.grade_number,
         D.hobbies
         SUM(A.total_marks) AS total_marks
     FROM A 
     LEFT OUTER JOIN B ON B.roll_no = A.roll_no 
     LEFT OUTER JOIN C ON C.roll_no = A.roll_no
     LEFT JOIN  
        (SELECT distinct roll_no, hobbies
         FROM D1) AS D ON A.roll_no = D.roll_no 
                       AND A.enrolldate = D.enrolldate
     WHERE B.class = '10' 
       AND B.subject IN ('0001','0002') 
       AND B.category = 'STATE'  
     GROUP BY  A.roll_no, A.name, C.desc,  B.grade_number, D.hobbies
     ORDER BY  A.class_date DESC) 
WHERE 
    A.country_code = 3
    AND C.state_code = 12
    AND B.class_code = 12 
ORDER BY 
    A.class_date DESC; 

where 子句中的某些条件是否可以在 join 之前推送,或者是否还有其他方法可以优化此查询?

【问题讨论】:

  • 请发布 DDL 和解释 - 没有这些,我们只是在猜测......
  • LEFT JOINs 更改为INNER JOINs。无论如何,您的 WHERE 子句正在撤消它。

标签: sql amazon-web-services amazon-s3 amazon-athena


【解决方案1】:
  • 您可以先将最后的WHERE 语句放在SELECT 中,因为它会减少访问的行数。实际上,这意味着您可以删除查询的整个 SELECT * 部分,并使其成为一个没有子选择的查询。
  • 为什么LEFT JOIN 中有一个ORDER BY -- 似乎不是必需的。
  • SELECT DISTINCT 的成本可能很高,所以如果可以避免/简化这将是一件好事。

检查EXPLAIN计划以发现查询的最高成本。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多