본문
프로젝트 도중에 굉장히 무거운 엔진을 API를 통해서 돌려야 하는 미션이 있었다.
해당 과정에서 목표 성능 지표는 TPS 40~50이었고, 첫 테스트 결과 20 TPS 미만이 나왔었다. 당연히 성능 테스트는 통과를 하지 못했고 응답속도 또한 9~10초 사이대가 나왔다.
원인
해결하기 위해 다양한 방법을 동원하여 재시도를 해보았는데 접속 유저를 1, 10, 50명으로 해도 응답속도가 똑같이 5초를 유지하는 이상한 현상을 발견했다. 유저가 줄어들면 당연히 응답속도가 줄어야 한다고 생각을 했는데 몇 명이 들어오든 같은 응답속도를 유지하는 것을 보고 어디선가 병목이 일어난다는 것을 발견할 수 있었다.
병목 위치를 찾던 도중 DBA가 이상한 테이블이 조회된다는 것을 알려주었고 확인 결과 조회가 많이 일어나는 테이블에 PK와 Index 설정이 되지 않았던 것이다. DB를 전체적으로 수정 했던 적이 있었는데 그때 누락 되었던 것 같다.
해결
결과 적으로 해당 테이블에 PK 추가를 하여 unique index를 추가하고 ****where 절에 자주 걸리는 컬럼 또한 sub index로 추가해 주었다.
테스트 결과
20TPS에 미치지 못하던 성능이 두 배가 올라 40 TPS를 달성한 것이다. index 설정으로 인한 성능 향상치 기댓값은 상당히 낮았었는데 두 배가 올라 목표치에 딱 맞춰진 게 너무 신기했다.
한창 공부를 할 때, 성능 개선과 테이블의 과부하 사이에 적당한 Index 설정이 중요하다고 배웠는데 막상 실전에서 몸으로 느껴보니까 서비스를 함에 있어서 굉장히 중요한 부분이라는 것을 알 수 있었던 경험이었다.
사용됐던 코드
- PK 추가 (이미 테이블이 만들어지고 난 후)
-- Oracle
ALTER TABLE [테이블 이름] ADD CONSTRAINT [PK 이름] PRIMARY KEY (컬럼1, 칼럼 2...);
- 인덱스 추가 (기존 테이블이 있는 경우)
-- Oracle
CREATE INDEX [인덱스 이름] ON [테이블명](컬럼1, 칼럼 2, 칼럼 3 ...)
- 시퀀스 추가
-- autoincrement를 위한 시퀀스
-- oracle은 autoincrement를 지원하지 않기 때문에 시퀀스를 통해서 설정해야 한다.
CREATE SEQUENCE [시퀀스 이름] START WITH 1 INCREMENT BY 1 NOCYCLE;
-- How to use
INSERT INTO [테이블 명] (no, 칼럼 1, 칼럼 2) VALUES ([시퀀스 이름].NEXTVAL, [데이터1], [데이터2]);
용어 설명
- TPS (Transactions per Second)
- 초당 발생하는 Business Transactions
- TPS = 총 Business Transaction 처리건수 / 단위시간 (sec)
- 1TPS = 60 TPM = 3600 TPH
- 시스템의 주요 성능 Factor
- 응답시간
- 응답시간은 사용자 측면에서의 성능을 평가하는 KPI로 주로 사용되며, 사용자가 해당 업무를 요청한 시점부터 서버로부터 그 결과에 대한 응답을 받아서 사용자 화면에 디스플레이할 때까지 소요된 총시간이다.
참고 자료
https://performance.tistory.com/4
TPS와 응답시간
정보시스템의 대표적인 성능 지표는 처리량 (Throughput)과 응답시간 (Response Time)이다. 1. 처리량 처리량은 시스템 측면의 대상 시스템에 대한 성능을 평가하는 KPI이며, 단위로는 주로 TPS (Transactions
performance.tistory.com
https://velog.io/@kkywalk2/DB%EC%9D%98-Primary-Key%EC%99%80-Unique-Key%EC%99%80-Index
DB의 Primary Key와 Unique Key와 Index
Primary Key와 Unique Key는 정확히 어떤 차이점을 갖고 있을까? 우선 눈으로 확인할 수 있는 차이점은 Unique Key는 Null을 허용 한다는 것일 것이다. 그렇다면 정말로 차이점은 그 뿐일까? 내부적으로는
velog.io
'CS Language > DB' 카테고리의 다른 글
Oracle WITH 절 사용법 (1) | 2024.04.19 |
---|---|
Oracle PGA 메모리 사양 초과 (1) | 2024.04.18 |
100만건의 데이터를 삽입하는 법 (Oracle) (1) | 2024.04.11 |