导入最佳实践
使用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子句使用批量插入操作来实现高性能数据插入。
如果需要将数据或数据子集从一个表移动到另一个表,可以使用INSERT和CREATE 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; |