
# 使用Hive CBO功能优化查询效率
#### 操作场景
在Hive中执行多表Join时，Hive支持开启CBO（Cost Based Optimization），系统会自动根据表的统计信息，例如数据量、文件数等，选出合适计划提高多表Join的效率。Hive需要先收集表的统计信息后才能使CBO正确的优化。
![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
- CBO优化器会基于统计信息和查询条件，尽可能地使join顺序达到合适。但是也可能存在特殊情况导致join顺序调整不准确。例如数据存在倾斜，以及查询条件值在表中不存在等场景，可能调整出非优化的join顺序。
- 开启列统计信息自动收集时，需要在reduce侧做聚合统计。对于没有reduce阶段的insert任务，将会多出reduce阶段，用于收集统计信息。
- 本章节适用于MRS 3.x及后续版本。
 
#### 前提条件
已登录Hive客户端，具体操作请参见[Hive客户端使用实践](https://support.huaweicloud.com/cmpntguide-mrs/mrs_01_0952.html)。
#### 操作步骤
1. 在Manager界面Hive组件的配置中搜索"hive.cbo.enable"参数，选中"true"永久开启功能。 
   ![](https://support.huaweicloud.com/cmpntguide-mrs/zh-cn_image_0000001209878965.png)
   
   
2. 手动收集Hive表已有数据的统计信息。 
   执行以下命令，可以手动收集统计信息。仅支持统计一张表，如果需要统计不同的表需重复执行。
   **ANALYZE TABLE \[db_name.\]tablename \[PARTITION(partcol1\[=val1\], partcol2\[=val2\], ...)\]**
   **COMPUTE STATISTICS**
   **\[FOR COLUMNS\]**
   **\[NOSCAN\];**
   ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
   - 指定FOR COLUMNS时，收集列级别的统计信息。
   
   - 指定NOSCAN时，将只统计文件大小和个数，不扫描具体文件。
    
   例如：
   **analyze table table_name compute statistics;**
   **analyze table table_name compute statistics for columns;**
   
   
3. 配置Hive自动收集统计信息。开启配置后，执行**insert overwrite/into** 命令插入数据时才自动统计新数据的信息。
   
   - 在Hive客户端执行以下命令临时开启收集： **set hive.stats.autogather = true;**开启表/分区级别的统计信息自动收集。
     **set hive.stats.column.autogather = true;**开启列级别的统计信息自动收集。
     ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
     - 列级别统计信息的收集不支持复杂的数据类型，例如Map，Struct等。
     
     - 表级别统计信息的自动收集不支持Hive on HBase表。
       
   
   
   
   - 在Manager界面Hive的服务配置中，搜索参数"hive.stats.autogather"和"hive.stats.column.autogather"，选中"true"永久开启收集功能。
   
   
   
   
4. 执行以下命令可以查看统计信息。 
   **DESCRIBE FORMATTED table_name\[.column_name\] PARTITION partition_spec;**
   例如：
   **desc formatted table_name;**
   **desc formatted table_name id;**
   **desc formatted table_name partition(time='2016-05-27');**
   ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
   分区表仅支持分区级别的统计信息收集，因此分区表需要指定分区来查询统计信息。
   
   
 
