본문으로 바로가기

JOIN을 통해서 데이터 UPDATE하기

category DataBase/MySQL 2023. 3. 31. 14:22

새로운 컬럼을 추가했는데, 해당 컬럼은 UNIQUE_ID로 연결된 테이블에 존재하는 값이지만,

SELECT COUNT(컬럼)시 속도의 문제가 너무 심각했다..

조건에서 필요한 데이터는 연결된 컬럼에 있고, 카운트는 JOIN한 테이블의 컬럼이었기에

2000건도 안되는 데이터가 20초가까이 걸렸다..

 

그러하여 컬럼을 추가하며 데이터를 어떻게하면 채워넣을 수 있을까 고민을 하다가

검색과 ChatGPT를 통합하여 정리해서 시도를 해보고 성공하여 정리해놓습니다.

 

 

JOIN UPDATE만 확인하고 싶다면..

 

테이블 정보(가명)

A

A_UNIQUE_ID
A_CATEGORY (String | null )

B

B_UNIQUE_ID
B_UNIQUE_ID

LOG

LOG_NO
A_UNIQUE_ID
B_UNIQUE_ID
A_CATEGORY (추가한 컬럼)

LOG 테이블에 A_CATEGORY를 추가하여, 해당 카테고리별 카운트를 세려고 합니다.

그렇다보니.. A테이블이 메인이 되고 B를 조인 후 LOG테이블은

ON A.A_UNIQUE_ID = LOG.A_UNIQUE_ID OR B.B_UNIQUE_ID = LOG.B_UNIQUE_ID

형식으로 조인을 하게되고, WHERE LOG.LOG_NO IS NOT NULL 조건으로 

LOG_NO를 카운트하게 되었다.. A테이블 전체를 기준으로 여러번 돌게되는 구조로 되다보니 느릴 수 밖에 없었다..

 

해당 업데이트 시 테이블들의 조건은 아래와 같다.

1. B테이블은 A를 무조건 참조한다.

2. LOG 테이블은 A_UNIQUE_ID 또는 B_UNIQUE_ID 둘 중 하나만 가질 수 있다.

(너무 간략하게 일부 테이블, 심지어 이름도 가명으로 지어놔서 "저런 구조로 왜 짠거야?"라고 생각하실 수도 있지만,

현재 회사에서 작업하는 테이블 구조를 실제로 보면, A에서도 특정 로그를 쌓아야하고, B에서도 특정 로그를 쌓아야한다.)

 

 

JOIN UPDATE SQL

UPDATE LOG
LEFT JOIN B ON B.B_UNIQUE_ID = LOG.B_UNIQUE_ID 
LEFT JOIN A ON A.A_UNIQUE_ID = LOG.A_UNIQUE_ID OR A.A_UNIQUE_ID = B.B_UNIQUE_ID
SET
  LOG.A_CATEGORY = A.A_CATEGORY
WHERE 1 = 1
  AND LOG.A_CATEGORY IS NULL
  AND A.A_CATEGORY IS NOT NULL;

위와 같은 형태로 해서 업데이트를 하여 성공하였다..

만약 데이터가 너무 많아서 저렇게 하기 부담스럽다 싶으시면

WHERE절에 조건으로 A_CATEOGRY의 정보를 추가로 넣으시면 될듯합니다.

 

만약 B 테이블이 없었을 경우 SQL (JOIN 1개)

UPDATE LOG
LEFT JOIN A ON A.A_UNIQUE_ID = LOG.A_UNIQUE_ID
SET
  LOG.A_CATEGORY = A.A_CATEGORY
WHERE 1 = 1
  AND LOG.A_CATEGORY IS NULL
  AND A.A_CATEGORY IS NOT NULL;

 

후기

초반 설계의 중요성을 느꼈습니다..
물론 다른 작업을 하다가 통계가 필요하게되어 추가된 부분이지만,
앞으로는 확장성까지 잘 고려해서 구조를 짜야겠다고 생각을 했습니다.
반응형