更新时间:2023-10-23 GMT+08:00

导入最佳实践

使用COPY命令导入数据

COPY命令从本地或其它数据库的多个数据源并行导入数据。COPY导入大量数据的效率要比INSERT语句高很多,而且存储数据也更有效率。

有关如何使用COPY命令的更多信息,请参阅使用COPY FROM STDIN导入数据

使用gsql元命令导入数据

\copy命令在任何psql客户端登录数据库成功后可以执行导入数据。与COPY命令相比较,\copy命令不是读取或写入指定文件的服务器,而是直接读取或写入文件。

这个操作不如COPY命令有效,因为所有的数据必须通过客户端/服务器的连接来传递。对于大量的数据来说COPY命令可能会更好。

有关如何使用\copy命令的更多信息,请参阅使用gsql元命令导入数据

\COPY只适合小批量,格式良好的数据导入,不会对非法字符做预处理,也无容错能力,无法适用于含有异常数据的场景。导入数据应优先选择COPY。

使用INSERT多行插入

插入如果不能使用copy命令,而您需要进行sql插入,可以根据情况使用多行插入。如果您使用的是列存表,一次只插入一行或几行,则数据压缩效率低下。

多行插入是通过批量进行一系列插入而提高性能。下面的示例使用一条insert语句向一个三列表插入三行。这仍属于少量插入,只是用来说明多行插入的语法。创建表的步骤请参考3.6-创建和管理表

向表customer_t1中插入多行数据:

openGauss=# insert into customer_t1 values 
(68, 'a1', 'zhou','wang'),
(43, 'b1', 'wu', 'zhao'),
(95, 'c1', 'zheng', 'qian');

有关更多详情和示例,请参阅INSERT

使用INSERT批量插入

带SELECT子句使用批量插入操作来实现高性能数据插入。

如果需要将数据或数据子集从一个表移动到另一个表,可以使用INSERTCREATE TABLE AS命令。

如果从指定表插入数据到当前表,例如在数据库中创建了一个表customer_t1的备份表customer_t2,现在需要将表customer_t1中的数据插入到表customer_t2中,则可以执行如下命令。

1
2
3
4
5
6
7
8
openGauss=# CREATE TABLE customer_t2
(
    c_customer_sk             integer,
    c_customer_id             char(5),
    c_first_name              char(6),
    c_last_name               char(8)
);
openGauss=# INSERT INTO customer_t2 SELECT * FROM customer_t1;

上面的示例等价于:

1
openGauss=# CREATE TABLE customer_t2 AS SELECT * FROM customer_t1;