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]$
|
댓글 없음:
댓글 쓰기