(PostgreSQL generate_series함수) 테이블 외래 키(Foreign Key) 참조 정합성을 유지 하면서 각종 형식의 대량 데이터 작성하기

PostgreSQL

PostgreSQL에서 성능 테스트를 위해 테이블과 테이블의 외래키(Foreign Key) 참조 정합성을 유지 하면서 각종 형식의 대량 데이터를 작성하는 방법을 설명합니다.

대량 데이터 작성용 샘플 테이블 작성

익숙한 Oracle의 샘플 스키마(scott)와 같은 테이블 구조를 PostgreSQL 데이터 베이스에 다음과 같이 작성합니다.

위 샘플 테이블은 다음 3가지가 중요 포인트입니다.

  • emp.deptno는 dept.deptno의 Foreign Key입니다.
  • dept.deptno와 emp.empno가 Primary Key입니다.
  • character varying, timestamp, numeric의 3가지 데이터 형식을 사용합니다.

대량 데이터 작성용 Insert문

데이터를 삽입하기 전에 기존 데이터를 삭제합니다. 필수사항은 아닙니다.

TRUNCATE TABLE DEPT CASCADE;
TRUNCATE TABLE EMP CASCADE;

DEPT 데이터 작성

generate_series(1,99) 함수를 사용하여 1에서 99까지의 값을 no 항목으로 취득합니다. no 값을 사용하여 다음과 같이 각 항목에 값을 설정합니다.

항목명설정 값설정 내용 설명
deptnono1에서 99까지의 숫자를 설정
dname ‘DNAME’ || to_char(no,’FM000000000′)‘DNAME000000001’ 에서 ‘DNAME000000099 ‘까지의 문자을 설정
loc‘LOC’ || to_char(no,’FM0000000000′)‘LOC000000001’ 에서 ‘LOC000000099’까지의 문자을 설정

Insert문은 다음과 같습니다.

insert into dept
  select no, 
     'DNAME' || to_char(no,'FM000000000'),
     'LOC' || to_char(no,'FM0000000000')
  from generate_series(1,99) as no;

다음 SQL문으로 삽입한 데이터를 확인합니다. 참고로 다음과 같이 limit 10을 지정하여 처음 10행만 취득할 수 있습니다.

select * from DEPT limit 10;

EMP데이터 작성

  • generate_series(1,50000000)함수를 사용하여 1에서 50000000까지의 값을 no 항목으로 취득합니다. no값을 사용하여 다음과 같이 각 항목에 값을 설정합니다.
항목명설정 값설정 내용 설명
empnono1에서 50000000까지의 숫자를 설정
enameto_char(no,’EFM000000000′)‘E000000001’에서 ‘E050000000’까지의 문자를 설정
jobto_char(no,’JFM000000000′)‘J000000001’에서 ‘J050000000’까지의 문자를 설정
mgrfloor(random()*10000) + 10에서 9999의 랜덤 숫자에 1을 더한 결과를 설정
hiredateclock_timestamp() – CAST( floor(random()*1000) || ‘ hours’ AS interval)현재 시간에서 0에서 999 사이의 랜덤 시간을 뺀 결과를 설정
sal(floor(random()*10000000) + 1) /1000에서 9999999의 랜덤 숫자에 1을 더하고 100으로 나눈 결과를 설정
comm(floor(random()*10000000) + 1) /1000에서 9999999의 랜덤 숫자에 1을 더하고 100으로 나눈 결과를 설정
deptno(no % 98) + 11에서50000000까지의 숫자를 98로 나눈 나머지에 1을 더한 결과(1에서 99까지의 숫자)를 설정

Insert문은 다음과 같습니다.

insert into EMP
  select no, 
     to_char(no,'EFM000000000'),
     to_char(no,'JFM000000000'),
     floor(random()*10000) + 1 ,
     clock_timestamp() - CAST( floor(random()*1000) || ' hours' AS interval),
     (floor(random()*10000000) + 1) /100,
     (floor(random()*10000000) + 1) /100,
     (no % 98) + 1
  from generate_series(1,5000) as no;

다음 SQL문으로 삽입한 데이터를 확인합니다. 대량 데이터를 전부 출력할 수 없으므로 다음과 같이 limit 10으로 출력할 레코드를 처음 10행으로 제한합니다.

select * from EMP limit 10;

제목과 URL을 복사했습니다