반응형
안녕하세요.
오늘은 근무 중 기존에 존재하던 SMS 발송 로직이 대량건수에도 빠른 시간내에 작동하도록 개선한 사례를 말씀드리려고 합니다.
참고로 SMS 발송을 하기 위해 특정 테이블에 데이터를 Insert해야하는 방식이며, 문자 하나(수신자 하나) 당 하나의 데이터행이 Insert됩니다.
개발 환경 : Spring Framework, ibatis
Insert 쿼리 개선
(로직 설명) JAVA단에서 수신자 리스트에서 수신거부수신자는 제외 → 필터링한 리스트를 Insert
(변경 전) 수신거부 확인 및 Insert에서 반복이 너무 많아 느려짐
- 통합된 리스트를 리스트의 길이(수신자의 수)만큼 반복하며 수신거부인지 확인
- 수신거부대상자를 제외한 수신자 리스트 추출 완료
- 전 단계에서 추출한 리스트의 길이(수신자의 수) 만큼 반복하며 Insert
(변경 후)
- java단에서 수신자 리스트를 decode에 들어갈 파라미터 변수 직접 설정(전화번호 및 고객명)
- select decode(...) from dual ... 를 이용하여 데이터생성하고 수신거부리스트쿼리와 JOIN 및 INSERT ALL로 이 데이터컬럼들을 Insert (batch Insert 사용)
DECODE 사용 방법
if절 처럼 사용할 수 있는 Oracle 기능이다.
(쿼리)
select decode(rownum, 1, '010-1234-5678', 2, '010-1111-1111', 3, '010-2222-2222') as phone
,decode(rownum, 1, '아무개', 2, '홍길동', 3, '철수') as name2
from dual
connect by level <= 3;
(결과)
INSERT 속도 개선을 위해 시도해봤던 방법들
- 수신거부리스트와 INSERT를 한 번에 판별 (INSERT ALL 이용) . 대신 수신자의 수만큼 JAVA단에서 반복 (batch Insert 사용) → 반복하다보면 쿼리 재호출 속도 느려짐
+ 쿼리를 반복할수록 왜 느려질까? 예상가는 이유 : 쓰레드, 커넥션풀, ibatis 설정 등의 로컬 설정 문제 - 쿼리 재호출을 막기 위해 1번 방법을 사용하고, 쿼리 안에 iterate를 넣어 쿼리 재호출 횟수를 줄여봄. → 여전히 느림
개인메모
로컬 이클립스에서 쿼리를 반복시키면, 속도가 점점느려진다.. 왜 그럴까?
추후에, 확인해보도록 하자.
반응형
'etc' 카테고리의 다른 글
IE(Internet Explorer) 에서 웹상에서 PDF 뷰어로 PDF 파일 바로 보기 (0) | 2021.10.13 |
---|---|
[etc] 솔루션에서 다른 테이블스페이스 접근 방식 (0) | 2021.08.23 |
[소스 개선] 중복체크 시 로직 변경 (0) | 2021.07.16 |
[서버 관리] Oracle 서버의 CPU가 급작스레 높아진 경우 (0) | 2021.06.29 |
[오류 해결] Script5009:FormData가 정의되지 않았습니다 (0) | 2021.06.23 |