我在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子句中的某些条件是否可以在连接之前推送,或者是否还有其他方法可以优化此查询?
1条答案
按热度按时间p8h8hvxi1#
你可以先把决赛
WHERE
语句,因为这样可以减少访问的行数。实际上,这意味着您可以删除整个SELECT *
查询的一部分,并使其成为一个没有子选择的单个查询。为什么会有
ORDER BY
在LEFT JOIN
--似乎不需要。这个
SELECT DISTINCT
可能成本很高,所以如果可以避免/简化这一点就好了。检查
EXPLAIN
计划发现查询的最高成本。