
진행하던 프로젝트가 끝나고 테스트와 분석용으로 만든 페이지를 사용할 일이 없어졌다. 이걸 가지고 무엇을 더 할 수 있을까, 라고 고민을 하던 중 DB와 관련된 설정들을 기본으로만 해두고 세부적으로 설정하지 않은 것이 기억났다. 실무에서 꼭 설정이 필요한 DB Connection Pool과 DB 암호화에 대해 공부하며 설정을 바꾸었고 현 포스팅은 DB Connection Pool과 스프링 부트에서 사용하는 커넥션 풀 중 한 종류인 Hikari CP에 대해 정리하려 한다. 환경 설정 Spring Boot 2.7.11 Gradle 7.6.1 IntelliJ IDEA 2023.1 DB Connection Pool(DBCP) 일반적인 데이터 연동은 웹 애플리케이션이 데이터를 필요할 때마다 매번 데이터베이스에 연결..
기능을 만들다보면 처음 정해진 사항에서 요구사항이 더 추가되거나 변경되는 경우가 많다. 현재 진행하던 프로젝트에서도 추가적으로 웹 페이지에 보여지면 더 좋을 듯한 정보를 추가하게 되었다. 하지만 쿼리를 변경함으로써 1초도 안걸리던 데이터 조회가 3초 이상이 걸리는 걸 확인하였다. 데이터 확인이 중요했던 터라 우선은 쿼리를 적용하였지만 초당 데이터를 조회해 확인해야 하는 페이지였기 때문에 쿼리 수정이 불가피하였다. 해당 포스팅은 쿼리의 성능을 향상시킬 때 어떻게 튜닝을 하면 될지에 대한 가이드라인으로 작성하였다.(미래의 나를 위해서 말이다.) 아래의 내용들은 어디까지나 참고용이고, 성능의 저하는 다른 방식으로 발생할 수 있다. SELECT시에 필요한 컬럼만 불러오기 -- Inefficient SELECT ..
프로젝트를 진행하면서 여러 테이블에서 정보를 한 번에 select 해와야 하는 기능을 추가하게 되었다. 초마다 데이터를 select 해와야하기 때문에 빠른 쿼리 조회가 중요한데 조회 쿼리를 실행해보니 한번 데이터를 select 하는데 6초가 걸렸다. 문제가 있다는 걸 확인했으니 원인이 무엇인지 찾으며 쿼리의 실행 속도를 향상시키기 위한 튜닝을 시작했다. 그 과정에서 분명 index가 있는 테이블임에도 불구하고 Index Scan이 아닌 Full Scan(Seq Scan)이 실행되는 것을 확인하였고, 이러한 경우는 어떻게 발생할 수 있는지 정리하였다. Index란 데이터베이스에서의 Index도 우리가 흔히 아는 책에 표시하는 인덱스 라벨과 동일한 역할을 하는 자료구조이다. 추가적인 쓰기 작업과 저장 공간을..
해당 포스팅은 PostgreSQL의 실행 계획 분석에 사용되는 EXPLAIN과 ANALYZE에 대한 개념을 기본으로 전제하고 있다. 이에 대해 알지 못한다면 아래의 포스팅을 먼저 읽기를 추천한다. [PostgreSQL] 쿼리 실행 계획 분석(explain, analyze) 쿼리 실행 계획 분석의 필요성 데이터베이스의 성능을 최적화하기 위해선 작성하는 쿼리문을 어떻게 짜는가도 중요하다. 때문에 데이터베이스가 실제로 쿼리를 실행하는 방식과 해당 쿼리의 justdo1tme.tistory.com PostgreSQL에서 실행 계획 분석을 실행할 때 실행되는 Table Scan 방식에는 5가지 종류가 있다. Sequential Scan Index Scan Index Only Scan Bitmap Scan TID S..
쿼리 실행 계획 분석의 필요성 데이터베이스의 성능을 최적화하기 위해선 작성하는 쿼리문을 어떻게 짜는가도 중요하다. 때문에 데이터베이스가 실제로 쿼리를 실행하는 방식과 해당 쿼리의 성능을 개발자가 인지하고 있어야 한다. 데이터베이스의 성능을 최적화할 수 있는 쿼리를 작성하기 위해서 개발자는 쿼리 실행 계획(Query execution plan)을 분석할 수 있어야 한다. 각 데이터베이스에 따라 쿼리 실행 계획 방법이 존재하며 이 포스팅은 PostgreSQL에서 실행하는 쿼리 실행 계획을 작성해보려 한다. Query Plan이란 데이터베이스 엔진은 쿼리를 수행할 때 어떤 방식을 사용하고 어떤 순서로 쿼리를 수행할지에 대한 계획을 세우는데, 이것을 쿼리 실행 계획(Query execution plan) 또는 ..
테이블 파티셔닝에 대해 공부하면서 오라클을 이용한 파티셔닝 생성 구문에서 이해가 안되는 create 구문이 존재하여 검색을 해보게 되었다. 그리고 그에 대한 내용을 정리해보았다. 테이블 생성 CREATE TABLE NEW_EMP (ENO NUMBER(10), ENAME VARCHAR2(10) ) TABLESPACE USERS PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS UNLIMITED BUFFER_POOL DEFAULT PCTINCREASE 50 ) LOGGING DISABLE ROW MOVEMENT ; TABLESPACE 테이블이 생성될 TABLESPACE..

대학교를 다닐 때 데이터베이스와 관련된 과목에서 파티셔닝에 대해 인덱스와 함께 배운 기억이 있다. 하지만 학교를 다니며 막상 사용하지 않으니 자연스럽게 잊게 되었고 취직을 하고 나니 이 개념을 다시 접하게 되면서 다시 한번 정리를 해보려 한다. DB 파티셔닝(Database Partitioning)의 배경 서비스가 커지며 데이터의 크기도 점점 대용량화 되면서, 기존에 사용하는 DB 시스템의 용량(storage)의 한계와 성능(performance)의 저하가 발생하였다. 대표적인 성능 저하로는 특정 데이터를 조회하려고 할 때 많은 시간의 소요 등이 있다. 즉, VLDB(Very Largy DBMS)와 같이 하나의 DBMS에 너무 큰 table이 들어가면서 용량과 성능 측면에서 많은 이슈가 발생하고, 이런 ..