【大数据之Hive】二十六、HQL之CBO优化、谓词下推、矢量化查询

1 CBO优化

  CBO是指Cost based Optimizer,即基于计算成本的优化。
  在Hive中,计算成本模型考虑到了:数据的行数、CPU、本地IO、HDFS IO、网络IO等方面。Hive会计算同一SQL语句的不同执行计划的计算成本,并选出成本最低的执行计划。
  目前CBO在hive的MR引擎下主要用于join的优化,例如多表join的join顺序。

相关参数:

--是否启用cbo优化 
set hive.cbo.enable=true;

案例
1、示例SQL语句

select
    *
from order_detail od
join product_info product on od.product_id=product.id
join province_info province on od.province_id=province.id;

2、关闭CBO优化

--关闭cbo优化 
sethive.cbo.enable=false;

--为了测试效果更加直观,关闭map join自动转换
sethive.auto.convert.join=false;

根据执行计划,三张表的join顺序如下:
【大数据之Hive】二十六、HQL之CBO优化、谓词下推、矢量化查询_第1张图片
3、开启CBO优化

--开启cbo优化 
sethive.cbo.enable=true;
--为了测试效果更加直观,关闭map join自动转换
sethive.auto.convert.join=false;

根据执行计划,三张表的join顺序如下:
【大数据之Hive】二十六、HQL之CBO优化、谓词下推、矢量化查询_第2张图片
4、总结
CBO优化对于执行计划中join顺序是有影响的。因为province info的数据量较小,所以将province_info的join顺序提前,会有更大的概率使得中间结果的数据量变小,从而使整个计算任务的数据量减小,也就是使计算成本变小。

2 谓词下推

  谓词下推指尽量将过滤操作前移,减少后续计算步骤的数据量。
  CBO优化也会完成一部分的谓词下推优化工作,因为在执行计划中,谓词越靠前,整个计划的计算成本就会越低。

相关参数:

--是否启动谓词下推(predicate pushdown)优化
set hive.optimize.ppd = true;

1、示例SQL语句

select
    *
from order_detail
join province_info
where order_detail.province_id='2';

2、关闭谓词下推优化

--是否启动谓词下推(predicate pushdown)优化
set hive.optimize.ppd = false;

--为了测试效果更加直观,关闭cbo优化
set hive.cbo.enable=false;

  执行计划中,过滤操作位于join操作后。
3、开启谓词下推优化

--是否启动谓词下推(predicate pushdown)优化
set hive.optimize.ppd = true;

--为了测试效果更加直观,关闭cbo优化
set hive.cbo.enable=false;

  执行计划中,过滤操作位于join操作之前。

3 矢量化查询

  Hive的矢量(也叫向量)化查询优化,依赖于CPU的矢量化计算。
  Hive的矢量化查询,可以极大的提高一些典型查询场景(例如scans, filters(过滤), aggregates(聚合), and joins)下的CPU使用效率。

CPU的矢量化计算的基本原理:
【大数据之Hive】二十六、HQL之CBO优化、谓词下推、矢量化查询_第3张图片
相关参数:

--开启矢量化计算
set hive.vectorized.execution.enabled=true;

  若执行计划中,出现“Execution mode: vectorized”字样,即表明使用了矢量化计算。
  array、struct等复杂数据类型和复杂操作不能作矢量化计算。

你可能感兴趣的:(hive,hive,大数据,hadoop)