一、为什么需要批量导入技术

在日常的数据库操作中,我们经常会遇到需要将大量数据快速导入数据库的需求。比如,从CSV文件导入几百万条记录,或者从其他数据库迁移数据。如果一条一条地插入,效率会非常低,甚至可能导致数据库连接超时或内存溢出。这时候,批量导入技术就显得尤为重要。

人大金仓 KingbaseES 提供了两种高效的批量数据导入方式:外部表和批量加载工具。这两种方法各有优缺点,适用于不同的场景。接下来,我们就详细聊聊它们的使用方法和优化技巧。

二、外部表的使用与优化

外部表是 KingbaseES 提供的一种特殊表,它并不实际存储数据,而是映射到外部的数据文件(如 CSV、TXT 等)。通过外部表,我们可以像操作普通表一样查询外部文件的数据,甚至可以将数据直接插入到目标表中。

2.1 创建外部表示例

假设我们有一个 students.csv 文件,内容如下:

id,name,age,score
1,张三,18,95
2,李四,19,88
3,王五,20,92

我们可以通过以下 SQL 创建外部表:

-- 创建外部表,映射到本地的CSV文件
CREATE FOREIGN TABLE ext_students (
    id INT,
    name VARCHAR(50),
    age INT,
    score FLOAT
)
SERVER file_fdw  -- 使用file_fdw外部数据包装器
OPTIONS (
    filename '/path/to/students.csv',
    format 'csv',
    header 'true'
);

注释说明:

  • file_fdw 是 KingbaseES 默认提供的外部数据包装器,用于访问本地文件。
  • OPTIONS 指定了文件路径、格式(CSV)以及是否包含表头。

2.2 查询外部表数据

创建完成后,我们可以直接查询外部表:

SELECT * FROM ext_students WHERE score > 90;

2.3 将外部表数据导入到目标表

如果数据验证无误,可以直接插入到目标表:

-- 假设目标表是students
INSERT INTO students (id, name, age, score)
SELECT id, name, age, score FROM ext_students;

优化建议:

  1. 文件格式优化:CSV 文件最好不带无关字符,避免解析错误。
  2. 批量提交:如果数据量很大,可以分批插入,减少事务压力。
  3. 索引调整:在导入前禁用目标表的索引,导入后再重建,提高速度。

三、批量加载工具的使用

KingbaseES 提供了 sys_bulkload 工具,专门用于高效导入大批量数据。它绕过 SQL 解析层,直接写入数据文件,性能比普通 INSERT 快很多。

3.1 基本使用方法

假设我们有一个 data.txt 文件,格式如下:

1|张三|18|95
2|李四|19|88
3|王五|20|92

我们可以编写控制文件 load.ctl

LOAD DATA
INFILE 'data.txt'
INTO TABLE students
FIELDS TERMINATED BY '|'
(id, name, age, score)

然后执行导入命令:

sys_bulkload control=load.ctl

3.2 高级优化选项

sys_bulkload 支持许多优化参数,例如:

LOAD DATA
INFILE 'data.txt'
INTO TABLE students
FIELDS TERMINATED BY '|'
(id, name, age, score)
BATCH_SIZE 10000  -- 每批处理10000条
ERRORS 100        -- 最多允许100条错误

优化建议:

  1. 调整批次大小:根据服务器内存调整 BATCH_SIZE,避免内存不足。
  2. 错误处理:设置合理的错误容忍度,避免因少量错误导致整个任务失败。
  3. 并行导入:如果数据文件很大,可以拆分成多个文件并行导入。

四、两种方式的对比与选型

4.1 外部表的优缺点

优点:

  • 灵活性高,支持复杂查询和过滤。
  • 无需额外工具,直接通过 SQL 操作。

缺点:

  • 性能不如 sys_bulkload,尤其是数据量极大时。
  • 需要文件在数据库服务器本地,不适合远程文件。

4.2 批量加载工具的优缺点

优点:

  • 性能极高,适合 TB 级数据导入。
  • 支持复杂的分隔符和转换规则。

缺点:

  • 需要额外学习控制文件语法。
  • 灵活性较低,无法进行复杂的数据清洗。

4.3 如何选择

  • 数据量小且需要清洗:用外部表。
  • 数据量极大且格式规整:用 sys_bulkload
  • 混合场景:可以先用外部表初步处理,再用 sys_bulkload 最终导入。

五、注意事项

  1. 文件权限:确保数据库用户有权限读取外部文件。
  2. 字符编码:文件编码需与数据库一致,避免乱码。
  3. 资源占用:大批量导入时,注意观察 CPU 和内存使用情况。
  4. 日志监控:记录导入过程中的错误,便于排查问题。

六、总结

KingbaseES 的外部表和批量加载工具是数据导入的利器,适用于不同的场景。外部表适合灵活的数据处理,而 sys_bulkload 则擅长超大数据量的快速导入。合理选择工具,并结合优化技巧,可以大幅提升数据导入效率。