
# 导入数据到DWS最佳实践
#### 从OBS并行导入数据
- 将导入数据拆分为多个文件 导入大数据量的数据时，需要较长的时间及耗费较多的计算资源。
  从OBS上导入数据时，如下方法可以提升导入性能：将数据文件存储到OBS前，尽可能均匀地将文件切分成多个，文件的数量为DN的整数倍更适合。
  
- 在导入前后验证数据文件 从OBS导入数据时，首先将您的文件上传到OBS存储桶中，建议您列出存储桶的内容，然后验证该存储桶是否包含所有正确的文件并且仅包含这些文件。
  在完成导入操作后，请使用SELECT查询语句验证所需文件是否已导入。
  
- OBS导入导出数据时，不支持中文路径。
 
 #### 使用GDS导入数据
- **GD** **S（General Data Service，数据并行加载工具 ）** 是一款运行在Linux操作系统的命令行工具，通过和外表机制的配合，实现数据的高速导入导出。GDS工具包需要安装在数据源文件所在的服务器上，数据源文件所在的服务器称为数据服务器，也叫GDS服务器。GDS导入数据示例请参见[使用GDS从远端服务器上导入表数据到DWS集群](https://support.huaweicloud.com/bestpractice-dws/dws_05_0032.html)。
- 数据倾斜会造成查询表性能下降。对于记录数超过千万条的表，建议在执行全量数据导入前，先导入部分数据，以进行数据倾斜检查和调整分布列，避免导入大量数据后发现数据倾斜而造成调整成本高。详细请参见[查看数据倾斜状态](https://support.huaweicloud.com/migration-dws/dws_15_0093.html)章节。
- 为了优化导入速度，建议拆分文件，使用多GDS进行并行导入。单个导入任务可以拆分成多个导入任务并发执行导入；多个导入任务使用同一GDS时，可以使用**-t**参数打开GDS多线程并发执行导入。GDS建议挂载在不同物理盘以及不同网卡上，避免物理IO以及网络可能出现的瓶颈。
- 在GDS IO与网卡未达到物理瓶颈前，可以考虑在DWS开启SMP进行加速。SMP开启之后会对对应的GDS产生成倍的压力。需要特别说明的是：SMP自适应衡量的标准是DWS的CPU压力，而不是GDS所承受的压力。有关SMP的更多信息请参见[SMP并行执行](https://support.huaweicloud.com/devg-dws/dws_04_0420.html)章节。
- GDS与DWS通信要求物理网络畅通，并且尽量使用万兆网（10GE网络）。千兆网无法承载高速的数据传输压力，极易出现断连。因此在千兆网环境下，DWS无法提供通信保障。满足万兆网的同时，数据磁盘组I/O性能大于GDS单核处理能力上限（约400MB/s）时，方可寻求单文件导入速率最大化。
- 并发导入场景与单表导入相似，至少应保证I/O性能大于网络最大速率。
- GDS跟DN的数据比例建议在1:3至1:6之间。
- 为了优化列存分区表的批量插入效率，在批量插入过程中会对数据进行缓存后再批量写盘。通过GUC参数"[partition_mem_batch](https://support.huaweicloud.com/devg-dws/dws_04_0899.html)"和"[partition_max_cache_size](https://support.huaweicloud.com/devg-dws/dws_04_0899.html)"，可以设置缓存个数以及缓存区大小。这两个参数的值越小，列存分区表的批量插入越慢。越大的缓存个数和缓存分区，会带来越多的内存消耗。
 
#### 使用INSERT多行插入
在导入时，如果不能使用COPY命令，可以根据情况使用多行插入。多行插入是通过批量进行一系列插入而提高性能。
下面的示例使用一条INSERT语句向一个三列表插入三行。这仍属于少量插入，只是用来说明多行插入的语法。
向表customer_t1中插入多行数据：
```
INSERT INTO customer_t1 VALUES 
(6885, 'maps', 'Joes'),
(4321, 'tpcds', 'Lily'),
(9527, 'world', 'James');
```
有关更多详情和示例，请参考[INSERT](https://support.huaweicloud.com/sqlreference-dws/dws_06_0236.html)章节。
#### 使用COPY命令导入数据
COPY命令用于从本地或其它数据库的多个数据源并行导入数据。COPY导入大量数据的效率远高于INSERT语句，而且存储数据也更有效率。
有关如何使用COPY命令的更多信息，请参考[使用COPY FROM STDIN导入数据](https://support.huaweicloud.com/migration-dws/dws_15_0043.html) 。
#### 使用gsql元命令导入数据
\\copy命令在任何gsql客户端登录数据库成功后可以执行导入数据。与COPY命令相比较，\\copy命令不是读取或写入数据库服务端的文件，而是直接读取或写入本地文件。
\\copy命令不如SQL COPY命令高效，因为所有的数据必须通过客户端/服务器的连接来传递。对于大量的数据来说SQL命令可能会更好。
有关如何使用\\copy命令的更多信息，请参阅[使用gsql元命令\\COPY导入数据](https://support.huaweicloud.com/migration-dws/dws_15_0042.html) 。
![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
\\COPY只适合小批量、格式良好的数据导入，容错能力较差。导入数据应优先选择GDS或COPY。
