使用 spark 版本 2 的 HIVE 中哪个更有效,max 或 order by desc limit 1
Which is more efficient, max or order by desc limit 1 in HIVE using spark version 2
由于 Hive 以分布式方式保存数据,当我们没有考虑分区或分桶中的列时,以下两个查询中哪个查询更有效。
select max(stat_id) from stats_tbl ;
select stat_id from stats_tbl order by stat_id desc limit 1;
肯定是 select max(stat_id) from stats_tbl
因为 order by
需要将所有数据收集(读取 "lots of shuffle")到一个 reducer 中(这就是为什么你必须提供一个 limit
子句it) 与可以分布式.
计算的聚合函数相比效率低下
查询执行的顺序是 from
-> where
-> group by
-> having
->select
-> order by
-> limit
所以 select max(stat_id) from stats_tbl ;
是一个简单的扫描操作,这意味着它只会逐行迭代一次,但查询 select stat_id from stats_tbl order by stat_id desc limit 1;
将在扫描后执行排序,然后应用 limit
。
而且我们也知道排序是昂贵的操作然后扫描所以查询 select max(stat_id) from stats_tbl;
比 select stat_id from stats_tbl order by stat_id desc limit 1;
更有效
由于 Hive 以分布式方式保存数据,当我们没有考虑分区或分桶中的列时,以下两个查询中哪个查询更有效。
select max(stat_id) from stats_tbl ;
select stat_id from stats_tbl order by stat_id desc limit 1;
肯定是 select max(stat_id) from stats_tbl
因为 order by
需要将所有数据收集(读取 "lots of shuffle")到一个 reducer 中(这就是为什么你必须提供一个 limit
子句it) 与可以分布式.
查询执行的顺序是 from
-> where
-> group by
-> having
->select
-> order by
-> limit
所以 select max(stat_id) from stats_tbl ;
是一个简单的扫描操作,这意味着它只会逐行迭代一次,但查询 select stat_id from stats_tbl order by stat_id desc limit 1;
将在扫描后执行排序,然后应用 limit
。
而且我们也知道排序是昂贵的操作然后扫描所以查询 select max(stat_id) from stats_tbl;
比 select stat_id from stats_tbl order by stat_id desc limit 1;