基于未分区Hive表创建分区视图的性能影响及原表分区必要性问询
答案
原表未分区是否会影响查询性能?
会,且影响非常明显。
Hive 的普通视图属于逻辑视图,本身不存储任何实际数据,每次查询视图本质都是在执行你创建视图时写的那段SQL逻辑,所有计算还是要落到原表的扫描读取上。
你提到的「视图按数据到达日期分区」只是逻辑层面的分区规则定义,没有和底层存储的分区结构挂钩。当你查询视图时携带了日期分区的过滤条件,就算Hive优化器把过滤条件下推到原表的扫描阶段,因为原表没有按日期字段做物理分区,Hive还是需要扫描原表下所有的存储文件,才能筛选出符合日期条件的记录,再进行后续的explode数组展开操作,会读取大量和查询无关的历史数据,数据量越大,查询效率越低。
是否需要对原表也进行分区?
非常建议按和视图相同的分区规则(也就是数据到达日期)对原表做分区,收益远高于改造成本:
- 分区裁剪完全生效:查询视图时的日期过滤条件下推后,可以直接命中原表对应日期的分区,仅扫描该分区下的存储文件,不需要扫描全表,查询性能通常会有几倍到几十倍的提升
- 运维成本大幅降低:后续如果要清理过期数据、排查某日期的数据问题,直接操作原表对应分区即可,不需要全表扫描过滤
- 改造成本极低:原表调整为分区表后,只要保证对外暴露的字段名、类型和原有未分区表完全一致,不需要修改现有视图定义和上层的查询逻辑,所有业务侧代码完全兼容。
内容的提问来源于stack exchange,提问作者shri
相关产品推荐
相关产品推荐

