티스토리 뷰

Web Development

Postgresql Bulk Insert From File

§무명소졸§ 2019. 11. 6. 11:02

많은 Batch 애플리케이션이 JDBC를 통한 SQL Insert 문을 통해서 처리하는 경우가 있다. 하지만 대부분 RDBMS는 파일을 읽어서 테이블에 직접 적재해주는 방법을 제공해준다.  Postgresql 에서 대용량 데이터를 파일을 통해 Insert하는 방법을 알아보겠다. 

 

database 접속 및 table 생성

DB 생성 및 사용자 생성 과정은 생략, 테이블 생성

$psql -U test_user -d test_db
psql (11.4, server 11.1)
Type "help" for help.

test_db=> create table sample(name varchar(100), age integer, sex varchar(1));
CREATE TABLE

 

sample data 파일 생성

, 구분자로 이름, 나이, 성별 데이터를 저장하고 있는 파일을 생성한다.

$touch data.txt
$vi ./touch
김말순,10,F
최종화,32,M
김구라,24,M
이종수,39,M
권아나,33,F
한혜진,29,F
노정렬,45,M
기러기,10,F
올리버,23,M
빨모샘,43,M

 

Postgres 계정으로 접속

postgres 계정으로 접근후 \list DB 리스트 확인 \c test_db 로 database swtich

$psql -U postgres
psql (11.4, server 11.1)
Type "help" for help.

postgres=# \list
                             List of databases
   Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges    
-----------+----------+----------+---------+-------+------------------------
 postgres  | postgres | UTF8     | C       | C     | 
 template0 | postgres | UTF8     | C       | C     | =c/postgres           +
           |          |          |         |       | postgres=CTc/postgres
 template1 | postgres | UTF8     | C       | C     | =c/postgres           +
           |          |          |         |       | postgres=CTc/postgres
 test_db   | postgres | UTF8     | C       | C     | =Tc/postgres          +
           |          |          |         |       | postgres=CTc/postgres +
           |          |          |         |       | test_user=CTc/postgres
(4 rows)

psotgres=#\c test_db
psql (11.4, server 11.1)
You are now connected to database "test_db" as user "postgres".
test_db=# 

 

Copy 명령어

간단하게 10건의 테스트 데이터를 입력했다. 시간을 측정해보지 않았지만 2억건 이상의 데이터를 입력했을때도 일반적인 애플리케이션을 통한 배치 시간보다 적게 걸린것 같다. (10분 이내)

test_db=# copy sample(name, age, sex) from '/home/test/data.txt' with delimiter ',';
COPY 10
test_db=# select * from sample;
  name  | age | sex 
--------+-----+-----
 김말순 |  10 | F
 최종화 |  32 | M
 김구라 |  24 | M
 이종수 |  39 | M
 권아나 |  33 | F
 한혜진 |  29 | F
 노정렬 |  45 | M
 기러기 |  10 | F
 올리버 |  23 | M
 빨모샘 |  43 | M
(10 rows)

test_db=# 

 

More

copy 명령어의 더 많은 정보는 아래의 링크에 나와있다.

https://www.postgresql.org/docs/10/sql-copy.html

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크