database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 10210 게시물 읽기
No. 10210
UPDATE 분산처리 방법
작성자
TEST
작성일
2020-11-11 17:56
조회수
144

안녕하세요 조언을 구하고 싶어서 올려봅니다. 


A,B 테이블을 left outer join으로 비교 후 값이 다른 컬럼이 있으면 A테이블에 B의 값들을 update 하는 쿼리입니다.

전체 테이블로 수행 시 병렬처리도 되지 않고 CPU도 하나만 써서 성능이 나오지 않았습니다.


코어가 충분한지라.. 

조건으로 row를 나눠서 update 작업을 여러 세션으로 처리하면 exclusive lock 없이 처리될 것 같아

A 테이블 전체와 B테이블 특정컬럼 숫자 별로(B.cc1=1) update 하도록 단순하게 procedure로 만들었습니다.


ex)

CREATE OR REPLACE PROCEDURE TEST_PROC(TT NUMERIC)

LANGUAGE sql AS $$


UPDATE A AS x

SET (c1,c2,c3)=(x2.cc1,x2.cc2,x2.cc3)

FROM (

    select a.c1,b.cc1,b.cc2,b.cc3 FROM A left outer join B on A.c1=B.cc1 WHERE B.cc1=1 AND (a.c1<>b.c1 OR a.c2<>b.c2 OR ....조건..조건..)

    ) x2

WHERE X.c1=X2.cc1 .... 조건...;


CALL TEST_PROC(1);

 


하나만 수행했을 때는 10초에 완료되었다면, 3개 동시 수행 시 1분, 10개 수행시 5분  이런식으로..

CPU는 세션수만큼 사용되긴해도 10%내외로 쓰고, 다수의 작업을 동시 수행하면 속도가 점점 저하되는 것이 확인되었습니다.


비교 범위가 작아지면 더 빠른 처리 가 될 것 같았는데.. 왜 더 느려지는걸까요?

또 UPDATE 처리를 분산해서 성능개선이 될 만한 방법이 있을까요?


쿼리 초짜라.. 조언을 부탁드립니다.



 

이 글에 대한 댓글이 총 1건 있습니다.

같은 테이블에 여러 세션들이 동시에 update를 한다면 update 속도가 떨어지는 것은 당연하겠죠. 


이 문제는 update 작업이 진행되고 있는 상황에서 

pg_stat_activity 에 보이는 wait_event 를 보고 판단해야합니다. 


wal 쓰기 쪽에 병목인지, 해당 로우 잠그는 작업의 병목인지, 공유 버퍼 선점 문제인지, 이런 저런 상황을 살펴보고, 그에 맞는 대책을 세워야합니다. 


일단 열쇠는 pg_stat_activity 뷰에 있습니다. 

 

김상기(ioseph)님이 2020-11-12 10:41에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
10213pgAdmin->서버상태에서 RELEASE_EXEC_SVP.... 값에대한 문의 [1]
초보
2020-11-26
55
10212wait_event 상태 [1]
궁금
2020-11-24
63
10210UPDATE 분산처리 방법 [1]
TEST
2020-11-11
144
10209dblink 관련 문의 드립니다. [2]
이종현
2020-11-11
111
10208쿼리 질문... [3]
신입
2020-11-10
154
10207컬럼 가공 시 NULL 처리 [2]
궁금
2020-11-06
128
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2020 DSN, All rights reserved.
작업시간: 0.011초, 이곳 서비스는
	PostgreSQL v13.0으로 자료를 관리합니다