最近在做会员系统,其中会员系统有一份企业信息初始化的数据,需要从SQL Server数据库导入到PostgreSQL,单表的数据近30万。
最开始的方案是在SQL Server上生成insert into的sql,再把生成的sql在Postgresql上导入。第一次导入时,没有删除索引,用了近2个小时才导完一张单表。
后面在网上找到PostgreSQL有一个Copy命令用于大量数据的导入导出(http://www.2cto.com/database/201309/241346.html),于是就用了Copy来导数据。
Copy的语法介绍:http://blog.sina.com.cn/s/blog_73094447010158zr.html,导入企业信息的Copy命令如下:
COPY tb_uni_enterprise(appid, eid, ename, status, creator, createtime,modifier, modifytime, memo) FROM '/tmp/init/enterprise.sql' DELIMITER '|';

导入数据过程:
/*1.删除索引*/
drop index UQ_IDX_UNI_ENTERPRISE_001;

/*2.清空表数据,注意该步骤,只有测试在重复部署环境时才执行,生产环境只初始化一次,不需要执行 */
truncate tb_uni_enterprise;

/*3.导入数据*/
COPY tb_uni_enterprise(appid, eid, ename, status, creator, createtime,modifier, modifytime, memo) FROM '/tmp/init/enterprise.sql' DELIMITER '|';

/*4.创建索引*/
create unique index UQ_IDX_UNI_ENTERPRISE_001 on TB_UNI_ENTERPRISE (
appid,
eid
);

使用Copy导入数据,30万数据导入约7秒。

第一次使用Copy导入时失败了,提示appid数据太长,原因是把整行数据都当做appid的数据了,Copy导入的文本内容要以\n作为行结束符(http://bbs.chinaunix.net/thread-1830462-1-1.html)。
另外PostgreSQL是安装在Linux环境的,在运行Copy时也有几个问题:
1.使用shell连接服务器后,找不到psql命令,原因是PostgreSQL的命令没有加到$PATH中
Linux中在每个用户的$HOME目录下有一个.bash_profile文件,这个文件是每次用户登录的时候都会执行,可以在.bash_profile中把PostgreSQL的命令加到$PATH中,在PostgreSQL的安装目录有一个set_env.sh的文件,文件中有设置环境变量的shell脚步,可以把该脚步的内容拷贝追加到.bash_profile中,也可以直接在.bash_profile中添加运行set_env.sh脚步语句:./PostgreSQL安装目录/set_env.sh。修改.bash_profile后需要重新登录才会生效。
2.执行Copy命令时没有目录权限
在Linux中安装的PostgreSQL都有一个叫postgres的用户,可以用postgres登录再创建目录,这样创建的目录对postgres来说就有读写权限了。
另外一种方法是用root用户创建目录,然后用"chmod 777 目录名"命令为所有用户加上读写权限。

备注:
测试过程中用到的PostgreSQL命令有
1.psql -U uni_auth 使用指定用于进入命令行
2.进入命令行后,默认的数据库是postgres,需要使用\c uni_auth_db命令来切换数据库
3.使用\?可以查看在命令行模式下所有的命令以及命令说明。

PostgresSQL使用Copy命令能大大提高数据导入速度的更多相关文章

  1. Oracle使用——Linux系统下使用命令实现oracle数据库数据导入

    背景 在工作当中,数据库的备份及数据导入是必不可少的操作,在完全无界面的Linux操作系统中,我们应该怎样实现oracle数据库的导入呢 前提 服务器已配置ftp 模拟环境 一台linux应用服务器上 ...

  2. Mysql提升大数据导入速度的绝妙方法

    一.对于Myisam类型的表,可以通过以下方式快速的导入大量的数据.      ALTER TABLE tblname DISABLE KEYS;     loading the data     A ...

  3. mysql 命令行快速导出数据,导入数据

    如果数据有20几万以上的时候,下面的方法很实用 导出数据 1.into outfile select * from table into outfile 'C:/a.sql'; 2.mysqldump ...

  4. Javascript高性能编程-提高数据访问速度

         hasOwnProperty()仅检索实例不检索原型,in即检索实例,又检索原型      成员嵌套越深,访问速度越慢,只在必要的情况下使用对象成员.      如果在同一个函数中你要多次读 ...

  5. 《java提高数据导入效率优化思路》

    写在前边的实现需求: 1.总共10万个电话号码: 2.电话号码中有重复和错误: 3.查找出正确的号码(不重复): 一.优化前的实现方式: 1.先用正则过滤一遍10万条数据,找出错误的: 2.用List ...

  6. [JDBC]批量提交插入语句以提高数据插入速度(效率提升不明显)

    // Initialize conn&stmt Connection conn=null; Statement stmt=null; ... conn=dataSource.getConnec ...

  7. GreenPlum/postgres copy命令导出/导入数据

    一.COPY命令简单实用 1.copy在postgres与GreenPlum介绍 1.1 postgrespostgres的COPY命令可以快速的导出/导入数据到postgresql数据库中,支持常用 ...

  8. postgresql copy命令介绍

    COPY 命令可以快速的导入数据到postgresql数据库中,文件格式类似TXT.CVS之类.适合批量导入数据,速度比较快.注意COPY只能用于表,不能用于视图. COPY 命令里面的文件必须是由服 ...

  9. Oracle数据导入导出命令

    IMP 和EXP命令 Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处 ...

随机推荐

  1. JSP概述、API、注释

    JSP自带的API包含4个包,可通过Tomcat的官网查看,JSP和EL的API是分开的 javax.servlet.jsp // 包含用于Servlet/JSP容器将JSP页面翻译为Servlet的 ...

  2. 基于centos6.5 hadoop 伪分布式安装

    步骤1:修改IP 地址和主机名: vi /etc/sysconfig/network-scripts/ifcfg-eth0 如果该文件打开为空白文件代表你计算机上的网卡文件不是这个名称“ifcfg-e ...

  3. 转载 html div三列布局占满全屏(左右两列定宽或者百分比、中间自动适应,div在父div中居底)

    原文地址:http://blog.csdn.net/duyelang/article/details/20558899 <p><!DOCTYPE html> <html ...

  4. iOS中四种实例变量的范围类型@private@protected@public@package

    文档上记录是这样的 The Scope of Instance Variables Toenforce the ability of an object to hide its data, the c ...

  5. iOS中堆和栈的区别

    管理方式: 对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来讲,释放工作有程序员控制,容易产生memory Leak. 申请大小: 栈:在Windows下,栈是向低地址扩展的数据结构,是一块 ...

  6. hdu 2588(简单的欧拉

    题意:给你一个n,m问你1-n里面(x)有多少对gcd(x, n)>=m. 思路:我们可以设n=a*b, x=a*c,此时我们可以知道b,c是互质的,那么就可以用欧拉来求解 /* gyt Liv ...

  7. WebSocket 长连接 及超时问题解决

    <?phpset_time_limit(0); class SocketService { private $address = 'localhost'; private $port = 80; ...

  8. Amount of Degrees(数位dp)

    题目链接:传送门 思路:考虑二进制数字的情况,可以写成一个二叉树的形式,然后考虑区间[i……j]中满足的个数=[0……j]-[0……i-1]. 所以统计树高为i,中有j个1的数的个数. 对于一个二进制 ...

  9. 关于oracle的基础增删改查操作总结

    ① 进入数据库: sqlplus“/as sysdba” 或者sqlplus / as sysdba 注:完整格式:  sqlplus“用户名/密码@数据库名as sysdba” 注:请注意,sqlp ...

  10. SPRING 事务管理说明

    spring 事务管理是通过AOP拦截指定的方法,进行事务管理. 事务配置 <aop:config proxy-target-class="true"> <aop ...