
# 合并CBO优化
#### 操作场景
Spark SQL默认支持基于规则的优化，但仅仅基于规则优化不能保证Spark选择合适的查询计划。CBO（Cost-Bsed Optimizer）是一种为SQL智能选择查询计划的技术。通过配置开启CBO后，CBO优化器可以基于表和列的统计信息，进行一系列的估算，最终选择出合适的查询计划。
#### 操作步骤
要使用CBO优化，可以按照以下步骤进行优化。
1. 需要先执行特定的SQL语句来收集所需的表和列的统计信息。 SQL命令如下（根据具体情况选择需要执行的SQL命令）：
   - 生成表级别统计信息（扫表）： *ANALYZE TABLE src COMPUTE STATISTICS*
     生成sizeInBytes和rowCount。
     使用ANALYZE语句收集统计信息时，无法计算非HDFS数据源的表的文件大小。
     
   
   - 生成表级别统计信息（不扫表）： *ANALYZE TABLE src COMPUTE STATISTICS NOSCAN*
     只生成sizeInBytes，如果原来已经生成过sizeInBytes和rowCount，而本次生成的sizeInBytes和原来的大小一样，则保留rowCount（若存在），否则清除rowCount。
     
   
   - 生成列级别统计信息 *ANALYZE TABLE src COMPUTE STATISTICS FOR COLUMNS a, b, c*
     生成列统计信息，为保证一致性，会同步更新表统计信息。目前不支持复杂数据类型（如Seq, Map等）和HiveStringType的统计信息生成。
     
   
   - 显示统计信息 *DESC FORMATTED src*
     在Statistics中会显示"xxx bytes, xxx rows"分别表示表级别的统计信息。也可以通过如下命令显示列统计信息：
     **DESC FORMATTED src a**
     
   
   
   **使用限制**：当前统计信息收集不支持针对分区表的分区级别的统计信息。
   

2. 在Spark客户端的"spark-defaults.conf"配置文件中进行[表1]设置。
    表1参数介绍 
   | **参数**                                 | **描述**                                                                                                                                                                                                                                                                                                                                                                                            | **默认值** |
   |:---|:---|:---|
   | spark.sql.cbo.enabled                  | CBO总开关。 - true表示打开，  - false表示关闭。   要使用该功能，需确保相关表和列的统计信息已经生成。                               | false   |
   | spark.sql.cbo.joinReorder.enabled      | 使用CBO来自动调整连续的inner join的顺序。 - true：表示打开  - false：表示关闭   要使用该功能，需确保相关表和列的统计信息已经生成，且CBO总开关打开。 | false   |
   | spark.sql.cbo.joinReorder.dp.threshold | 使用CBO来自动调整连续inner join的表的个数阈值。 如果超出该阈值，则不会调整join顺序。                                                                                                                                                                                                                                                                                              | 12      |
      
   
 
