안녕하세요 조언을 구하고 싶어서 올려봅니다.
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 처리를 분산해서 성능개선이 될 만한 방법이 있을까요?
쿼리 초짜라.. 조언을 부탁드립니다.
|