zoukankan      html  css  js  c++  java
  • PostgresSQL使用Copy命令能大大提高数据导入速度

    最近在做会员系统,其中会员系统有一份企业信息初始化的数据,需要从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导入的文本内容要以 作为行结束符(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.使用?可以查看在命令行模式下所有的命令以及命令说明。

  • 相关阅读:
    codeforces 1060 B
    codeforces 1060 A
    牛客 国庆七天乐 day1 L
    BZOJ 1087: [SCOI2005]互不侵犯King
    codeforces 792CDivide by Three(两种方法:模拟、动态规划
    codeforces 797C Minimal string
    codeforces 110E Lucky Tree
    codeforces 798D
    2017福建省赛 FZU2272~2283
    Android -- Looper、Handler、MessageQueue等类之间关系的序列图
  • 原文地址:https://www.cnblogs.com/junge8618/p/5513966.html
Copyright © 2011-2022 走看看