
# 执行导入数据
完成GDS的安装部署及外表创建后，本节介绍如何在DWS数据库中创建事实表并将数据导入事实表中。
对于记录数超过千万条的表，建议在执行全量数据导入前，先导入部分数据，以[进行数据倾斜检查和调整分布列](https://support.huaweicloud.com/migration-dws/dws_15_0093.html#ZH-CN_TOPIC_0000002219984088)，避免导入大量数据后发现数据倾斜，调整成本高。
#### 前提条件
GDS服务器和DWS集群之间网络可以互通。
- 需要创建一个弹性云服务器作为GDS服务器。
- 创建的弹性云服务器与DWS集群应处于同一区域、同一虚拟私有云和子网。
 
#### 操作步骤
1. 在DWS中创建目标表，用于存储导入的数据。
2. （可选）若导入表存在索引，在数据导入过程中，将增量更新索引信息，影响数据导入性能。建议在执行数据导入前，先删除相关表的索引，但是如果不能保证数据唯一性不建议删除唯一索引。在数据导入完成后，再重新创建索引。 
   1. 假定在导入表"product_info"上的"product_id"字段上存在普通索引"product_idx"。在执行数据导入前，请先删除相关索引。
      ```
      DROP INDEX product_idx;
      ```
      
   
   2. 在数据导入完成后，重建索引。
      ```
      CREATE INDEX product_idx ON product_info(product_id);
      ```
      
   
   
   
   
3. 执行数据导入。 
   ```
   INSERT INTO [目标表名] SELECT * FROM [foreign table 表名];
   ```
   - 如果出现以下类似信息，说明数据导入成功。请查询错误信息表，查看是否存在数据格式错误，详细操作请参见[处理导入错误](https://support.huaweicloud.com/migration-dws/dws_15_0026.html#ZH-CN_TOPIC_0000002219983988)。
     ```
     INSERT 0 9
     ```
     
   
   - 如果出现数据加载错误，请参见[处理导入错误](https://support.huaweicloud.com/migration-dws/dws_15_0026.html#ZH-CN_TOPIC_0000002219983988)，并重新执行数据导入。
   
   
   ![](https://support.huaweicloud.com/migration-dws/public_sys-resources/note_3.0-zh-cn.png)
   - 如果执行过程中出现数据加载错误，则数据全部导入失败，没有数据导入至目标表中。
   
   - 编写批处理任务脚本，实现并发批量导入数据。并发量视机器资源使用情况而定。可通过几个表测试，监控资源利用率，根据结果提高或减少并发量。常用资源监控命令有：内存和CPU监控top命令，IO监控命令iostat，网络监控命令sar等。相关案例请参见[多线程导入](https://support.huaweicloud.com/migration-dws/dws_15_0028.html#ZH-CN_TOPIC_0000002220143852__zh-cn_topic_0000001764650932_zh-cn_topic_0000001233761893_section197704383292)。
   
   - 在资源许可的情况下，多台GDS服务器并发导入会很大程度上提高数据导入效率。相关案例请参见[多数据服务器并行导入](https://support.huaweicloud.com/migration-dws/dws_15_0028.html#ZH-CN_TOPIC_0000002220143852__zh-cn_topic_0000001764650932_zh-cn_topic_0000001233761893_section2041618243291)。
   
   - 对于高并发的GDS导入场景，为了保持GDS和DN间的数据连接稳定，可以将GDS服务器环境和DN所在环境的TCP Keepalive检测时间增长（推荐增长至5分钟）。调整集群环境的TCP Keepalive参数会影响故障检测的响应时间。
    
   
   
 
#### 任务示例
1. 创建一个名为reasons的目标表。
   ```
   CREATE TABLE reasons
   (
     r_reason_sk   integer  not null,
     r_reason_id   char(16) not null,   
     r_reason_desc char(100)
   )
   DISTRIBUTE BY HASH (r_reason_sk);
   ```
   
2. 在执行数据导入前，先删除相关表的索引。
   假定在导入表"reasons"上的"r_reason_id"字段上存在普通索引"reasons_idx"。在执行数据导入前，请先删除相关索引。
   ```
   DROP INDEX reasons_idx;
   ```
   
3. 将数据源文件中的数据通过外表"foreign_tpcds_reasons"导入到表"reasons"中。
   ```
   INSERT INTO reasons SELECT * FROM foreign_tpcds_reasons ;
   ```
   
4. 在数据导入完成后，再重新创建索引。
   ```
   CREATE INDEX reasons_idx ON reasons(r_reason_id);
   ```
   
 
