首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >配置单元不利用查询中的分区

问配置单元不利用查询中的分区
EN

Stack Overflow用户
提问于 2019-09-11 21:40:44
回答 1查看 456关注 0票数 2

我有一个视图,可以为Hive历史表提取最新的数据。历史表是按天分区的。视图的工作方式非常简单-它有一个子查询,它在日期字段(用作分区的字段)上执行最大日期,然后根据该值过滤表。该表包含数百天(分区),每个分区都有数百万行。为了加速子查询,我尝试将扫描的分区限制为最后一个创建的分区。考虑到假日周末,我将返回四天,以确保查询返回数据。

如果我使用日期硬编码值,则子查询运行得非常快,并将其限制为正确的分区。

但是,如果我尝试用子查询限制分区以计算最后一个分区,它将无法识别分区并执行全表扫描。当过滤器工作时,查询将返回正确的结果,但它需要很长时间,因为它不限制扫描的分区。

我尝试以WITH语句的形式执行子查询,然后在bus_date上使用INNER JOIN,但得到了相同的结果-没有利用分区。

该行为可通过查询重复,因此我将使用该行为而不是视图来演示:

代码语言:javascript
复制
SELECT *
  FROM a.transactions
 WHERE bus_date IN (SELECT MAX (bus_date)
                      FROM a.transactions maxtrans
                     WHERE bus_date >= date_sub (CURRENT_DATE, 4));

没有错误消息,并且查询实际工作(过滤以提取正确的数据),但它扫描所有分区,因此速度非常慢。如何将查询限制为使用子查询中标识的分区?

EN

回答 1

Stack Overflow用户

发布于 2019-09-17 20:41:27

我仍然希望有人会对这个问题有答案,但我确实想把我想出的变通办法张贴出来,以防对其他人有用。

SELECT * FROM a.transactions WHERE bus_date >= date_sub (CURRENT_DATE, 4) AND bus_date IN (SELECT MAX (bus_date) FROM a.transactions maxtrans WHERE bus_date >= date_sub (CURRENT_DATE, 4));

查询有点笨拙,因为它在业务日期上过滤了两次。第一次将主要数据集限制为最近四天(限制到这些分区,并避免扫描所有分区),第二次将其固定到已加载数据的最后一天(通过最大bus_date)。这并不完美,但比扫描所有分区的查询性能要好得多。谢谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57890520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档