2017년 8월 8일 화요일

Greenplum DML(Insert, Update, Delete)



6.      DML


1)        Insert


-       Postgresql 에서 사용되는 모든 Insert 쿼리를 지원
           -       대용량의 데이터를 적재할 경우에는 COPY, External Table, gpload 등을 이용하는 것이 효율



## 한건 Insert 하는 경우

INSERT INTO names (col1, col2, col3)

VALUES (1, 'test', 'U');

 

## 한건 Insert 하는 경우

INSERT INTO names VALUES
           (1, 'test', 'U');

 

## Multi row Insert

INSERT INTO names VALUES
           (1, 'test', 'U'),(2, 'test', 'V');

 

## Insert / Select

INSERT INTO foo (a,b) SELECT c,d FROM foo_ext;

 

 

## sequece 이용한 Insert

INSERT INTO names VALUES
           (nextval('names_seq'), 'test', 'U');

 

2)        Delete


-       제약조건 : Table 조인 해서 삭제하는 경우에는 반드시 equijoins 이어야 함.

-       Delete : 삭제시 scan을 함

-       Truncate : 삭제시 scan를 하지 않음.



## 단일 테이블 삭제시

DELETE FROM rank WHERE year='2001';

 

## 테이블 조인 삭제시

DELETE FROM foo f USING bar b WHERE f.foo_id = b.bar_id ;


## 테이블 전체 삭제시

DELETE FROM rank; (deletes all rows)
TRUNCATE command

 

n  조인 삭제 예제



-- 튜닝

DELETE  gp_master

WHERE gpid IN (SELECT gpid

                 FROM   gp_buying_log

                 WHERE  log_Date <= to_date('20100101', 'yyyymmdd')

                 GROUP BY gpid

                 ) ;

- 튜닝

CREATE temp TABLE temp_gp_master

With(appendonly=true; compresslevel=1)

AS                

SELECT gpid

FROM   gp_master

WHERE  gpid IN (SELECT gpid

                 FROM   gp_buying_log

                 WHERE  log_Date <= to_date('20100101', 'yyyymmdd')

                 GROUP BY gpid

                 )

DISTRIBUTED BY (gpid)

;

 

DELETE FROM  gp_master s

USING  temp_gp_master t

WHERE  s.gpid = t.gpid

;

1. gp_master 테이블의 분산키

- gp_id

 

2. delete 대상 테이블의 분산키와 조건절의 키를 정확히 일치시켜 줘야 하므로

삭제 대상 데이터들만으로 상호 조인대상 테이블간의 분산키가 일치하는 임시테이블을 생성

delete 구문 실행

3)        Update


-       제약조건 : Table 조인 해서 update하는 경우에는 반드시 equijoins 이어야 함.



## 단일 테이블 update

UPDATE names SET name='Emily' WHERE name='Emmmily';

 

## 테이블 조인 update

UPDATE foo f

SET f.class = b.class

FROM bar b

WHERE f.foo_id = b.bar_id ;   

n  조인 update 예제



-- 튜닝

UPDATE  gp_master

  SET   age = age + 1,

         status_yn = 'N'

  WHERE gpid IN (SELECT gpid

                 FROM   gp_buying_log

                 WHERE  log_Date <= to_date('20100101', 'yyyymmdd')

                 GROUP BY gpid

                 ) ;

- 튜닝

CREATE temp TABLE temp_gp_master

With(appendonly=true; compresslevel=1)

AS                

SELECT gpid

FROM   gp_master

WHERE  gpid IN (SELECT gpid

                 FROM   gp_buying_log

                 WHERE  log_Date <= to_date('20100101', 'yyyymmdd')

                 GROUP BY gpid

                 )

DISTRIBUTED BY (gpid)

;

 

UPDATE gp_master s

SET    age = s.age + 1,

       status_yn = 'N'

FROM   temp_gp_master t

WHERE  s.gpid = t.gpid

;

1. gp_master 테이블의 분산키

- gp_id

 

2. 튜닝 방법: UPDATE 대상 테이블의 분산키와 조건절의 키를 정확히 일치시켜 줘야 하므로

업데이트 대상 데이터들만으로 상호 조인대상 테이블간의 분산키가 일치하는 임시테이블을 생성

UPDATE 구문 실행
 

4)        Transaction 처리


n  트랜잭션 모드

-       BEGIN or START TRANSACTION

-       END or COMMIT

-       ROLLBACK

-       SAVEPOINT and ROLLBACK TO SAVEPOINT

 

n  트랜잭션 처리

-       트랜잭션을 처리를 위해서는 쿼리를 BEGIN ~ END 절 안에 있어야 함.



## 테스트를 위한 사전 준비

create table trx_test( a int) distributed by (a);

alter table trx_test add constraint pk_trx_test primary key (a);

insert into trx_test values (1), (2), (3);

 

 

## 트랜잭션 테스트를 위한 sql 파일생성

[gpadmin@mdw shlee]$ vi trx_test.sql

select * from trx_test;

 

BEGIN;

delete from trx_test where a=2;

insert into trx_test values (1), (2);

END;

 

select * from trx_test;

 

## 트랜잭션 확인

[gpadmin@mdw shlee]$ psql -ef trx_test.sql

Timing is on.

select * from trx_test;

 a

---

 3

 2

 1

(3 rows)

 

Time: 94.877 ms

BEGIN;

BEGIN

Time: 0.495 ms

delete from trx_test where a=2;

DELETE 1

Time: 1.707 ms

insert into trx_test values (1), (2);

psql:trx_test.sql:5: ERROR:  duplicate key violates unique constraint "pk_trx_test"  (seg18 sdw4:40000 pid=7607)

END;

ROLLBACK           --à duplication error 발생 자동으로 Rollback 처리됨

Time: 0.090 ms

select * from trx_test;

 a

---

 3

 2

 1

(3 rows)           --> 롤백 후의 건수 확인 가능

 

Time: 1.686 ms

[gpadmin@mdw shlee]$

댓글 없음:

댓글 쓰기

Greenplum Backup & Restore

Greenplum에서는 gpbackup과 gprestore를 이용해서 대량의 데이터를 병렬로 백업/병렬로 복구를 지원하고 있습니다. Full 백업이외에도 incremental 백업을 지원하고 있습니다.  - incremental 백업시에는 반드시 사전...