为什么选择Count(*)比hive中的Select *慢

时间:2013-06-12 08:09:52

标签: sql hadoop hive

当我在VirtualBox Sandbox中使用hive运行查询时。我觉得Select count(*)Select *慢得多。

任何人都可以解释背后发生的事情吗?

为什么会出现这种延迟?

3 个答案:

答案 0 :(得分:12)

select * from table

它可以是仅限地图的工作但是

Select Count(*) from table 

它可以是Map and Reduce工作

希望这有帮助。

答案 1 :(得分:3)

配置单元查询可以执行三种类型的操作。

为了最便宜,最快,更昂贵,也更慢。

配置单元查询可以是仅元数据请求。

显示表,描述表是示例。在这些查询中,hive进程在元数据服务器中执行查找。元数据服务器是一个SQL数据库,可能是MySQL,但实际的数据库是可配置的。

配置单元查询可以是hdfs get请求。 从表中选择*就是一个例子。在这种情况下,hive可以通过执行hdfs操作来返回结果。 hadoop fs -get,或多或少。

配置单元查询可以是Map Reduce作业。

Hive必须将jar发送到hdfs,jobtracker将任务排队,tasktracker执行任务,最终数据放入hdfs或发送到客户端。

Map Reduce工作也有不同的可能性。

它可以是仅限地图的作业。 从表中选择*,其中id> 100,例如,所有逻辑都可以应用于映射器。

它可以是Map和Reduce工作, 从表中选择min(id); 从id;表顺序中选择*;

它还可以导致多个地图Reduce传递,但我认为上面总结了一些行为。

答案 2 :(得分:2)

这是因为数据库正在使用聚簇主键,因此查询会逐行搜索每一行的键,而不是从索引中划分行。

  • 运行optimize table。这将确保数据页面 按排序顺序物理存储。这可以想象加快一个 群集主键上的范围扫描。

  • 仅在change_event_id上创建一个额外的非主索引 柱。这将在索引页面中存储该列的副本 扫描速度要快得多。创建后,检查解释计划 确保它使用新索引