
# 建立Hive表分区提升查询效率
#### 操作场景
Hive在做Select查询时，一般会扫描整个表内容，会消耗较多时间去扫描不关注的数据。此时，可根据业务需求及其查询维度，建立合理的表分区，从而提高查询效率。
#### 操作步骤
1. MRS 3.x之前版本： 
   登录MRS控制台，在左侧导航栏选择"现有集群"，单击集群名称。选择"节点管理 \> 节点名称" ，进入弹性云服务器界面。单击"远程登录"按钮，完成Hive节点的登录。
   MRS3.x及后续版本：
   以**root**用户登录已安装Hive客户端的节点。
   
   
2. 执行以下命令，进入客户端安装目录，例如"/opt/client"。 
   **cd /opt/client**
   
   
3. 执行**source bigdata_env**命令，配置客户端环境变量。
4. 在客户端中执行如下命令，执行登录操作。 
   **kinit** *用户名*
   
   
5. 执行以下命令登录客户端工具。 
   **beeline**
   
   
6. 指定静态分区或者动态分区。 
   - 静态分区： 静态分区是手动输入分区名称，在创建表时使用关键字**PARTITIONED BY** 指定分区列名及数据类型。应用开发时，使用**ALTER TABLE ADD PARTITION** 语句增加分区，以及使用**LOAD DATA INTO PARTITION**语句将数据加载到分区时，只能静态分区。
     
   
   - 动态分区：通过查询命令，将结果插入到某个表的分区时，可以使用动态分区。 动态分区通过在客户端工具执行如下命令来开启：
     **set hive.exec.dynamic.partition=true** **;**
     动态分区默认模式是strict，也就是必须至少指定一列为静态分区，在静态分区下建立动态子分区，可以通过如下设置来开启完全的动态分区：
     **set hive.exec.dynamic.partition.mode=nonstrict** **;**
     
   
   
   ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
   - 动态分区可能导致一个DML语句创建大量的分区，对应创建大量新文件夹，对系统性能可能带来影响。
   
   - 在文件数量大的情况下，执行一个SQL语句启动时间较长，可以在执行SQL语句之前执行"set mapreduce.input.fileinputformat.list-status.num-threads = 100;"命令来缩短启动时间。"mapreduce.input.fileinputformat.list-status.num-threads"参数需要先添加到Hive的白名单才可设置。
    
   
   
 
