모르지 않다는 것은 아는것과 다르다.

전체 글 224

PostgreSQL 실행계획 분석하기 3편 (Join Methods)

개요 개발자는 여러 형태의 조인문 작성해서 실행한다. PostgreSQL에서 옵티마이저는 조인이 포함된 쿼리를 보통 아래 3가지 조인 방법 중에서 적절한 조인 방식을 선택한다. NL Join (Nested Loop Join) Hash Join Merge Join 따라서, 조인 방법을 이해하는 것은 실행계획을 분석하는데 매우 중요한 부분이다. 필수 사전 지식 PostgreSQL 옵티마이저 PostgreSQL 실행계획 분석하기 1편 (실행계획 읽는 방법) PostgreSQL 실행계획 분석하기 2편 (Table Scan) 테이블 생성 create table team ( team_id bigint, team_name varchar(100), created_at timestamp with time zone ); ..

Database 2023.11.19

PostgreSQL 실행계획 분석하기 2편 (Table Scan)

개요 실행계획을 정확히 분석하기 위해서는 PostgreSQL의 옵티마이저가 어떤 방식으로 테이블을 스캔하는지 알아야 한다. PostgreSQL에서 자주 사용되는 테이블 스캔 방식은 아래 4가지이다. Seq Scan Index Scan Index Only Scan Bitmap Scan 이외에도 Tid Scan, CTE Scan, Subquery Scan, Function Scan, Values Scan, Foreign Scan 등이 있지만 가장 자주 사용되는 위의 4가지 스캔방식에 대해서만 정리해 보려고 한다. 필수 사전 지식 PostgreSQL 옵티마이저 PostgreSQL 실행계획 분석하기 1편 (실행계획 읽는 방법) 테이블 아래와 같이 테이블을 하나 만들었다. CREATE TABLE scan_test..

Database 2023.11.18

PostgreSQL 실행계획 분석하기 1편 (실행계획 읽는 방법)

PostgreSQL 실행계획 분석(기본) 개요 개발을 진행하면서 종종 실행 계획을 참조하게 되지만, 대부분은 실행 시간과 인덱스를 잘 타는지 정도만 확인했다. 실행 계획의 전체적인 구성이나 옵티마이저의 결정 과정에 대한 이해가 부족하다고 느꼈다. 그래서 틈틈히 실행계획을 읽는 방법이나 분석하는 방법을 찾아보았고 이번 기회에 합습한 내용들을 정리해보려고 한다. 실행계획을 분석하는 방법은 6편 정도에 걸쳐서 정리해 볼 생각이다. 이번 편에서는 실행계획을 구성하는 구성요소와 실행계획을 읽는 방법에 대해서 알아보자. 필수 사전 지식 PostgreSQL 옵티마이저 테이블 생성 테스트에 사용될 3개의 테이블을 만든다. -- customers 테이블 생성 CREATE TABLE customers ( customer_..

Database 2023.11.16

PostgreSQL 옵티마이저

개요 쿼리를 효율적으로 짜기 위해서는 옵티마이저의 동작원리를 잘 알아야 된다. 즉, 옵티마이저의 마음을 이해하는 것이 중요하다. 하지만 생각보다 옵티마이저의 동작원리를 이해하는 것은 복잡하고 깊은 내용이다. 그렇지만 간단하게라도 옵티마이저에 대해서 정리하고 넘어가려고 한다. 먼저 쿼리가 어떤식으로 실행되는지 간단하게 알아보자. 쿼리 실행 흐름 Parser 입력받은 쿼리의 문법을 검증하고 Parse Tree를 생성한다. Analyzer Parser로 부터 전달받은 Parse Tree를 바탕으로 Query Tree를 생성한다. pg_catalog에 담겨 있는 정보를 바탕으로 테이블, 칼럼, 제약조건 등에 대한 Sematic 검증을 수행한다. Query Tree는 테이블, 칼럼을 참조하기 위한 정보를 포함한다..

Database 2023.11.14

인덱스 (With PostgreSQL)

개요 인덱스는 쿼리 성능을 최적화하는데 가장 중요한 요소라고 생각한다. 단순히 인덱스를 사용하는 것이 중요한 것이 아니라 동작원리를 정확히 이해하고, 효율적으로 사용하는 것이 중요하다. 이번 글에서는 인덱스의 동작원리와 인덱스를 올바르게 설계하는 방법에 대해서 정리해보려고 한다. 인덱스 정의 데이터베이스에서 인덱스란 데이터를 빠르게 검색하고 접근할 수 있도록 돕는 데이터 구조이다. 즉 인덱스는 데이터를 빠르게 조회하기 위해서 사용된다. 만약 아래와 같은 테이블이 있다고 가정하자. 위 테이블에서 select * from 사원 where 사원코드 = 'A010' and 시작일자 = '2022-02-01' and 종료일자 = '2023-01-01' 에 해당하는 데이터를 추출 해보자. 데이터 수가 많지 않아서 ..

Database 2023.11.04

서브쿼리 (With QueryDSL)

개요 실무에서 종종 서브쿼리가 포함된 쿼리들을 만나곤 한다. 이번 글에서는 서브쿼리의 종류와 특징에 대해서 정리해 보고, QueryDSL로 구현하는 방법도 정리해보려고 한다. 서브쿼리의 종류 서브쿼리는 크게 아래 3가지 형태이다. Nested Subquery (중첩 서브쿼리) Inline View (인라인 뷰) Scalar Subquery (스칼라 서브쿼리) Nested Subquery (중첩 서브쿼리) 중첩 서브쿼리는 주로 WHERE 절에서 사용된다. 그렇기 때문에 주로 IN, EXISTS, ANY, ALL 등과 같은 연산자와 함께 사용되어 결과집합을 한정하는데 주로 사용된다. 서브쿼리가 메인쿼리 칼럼을 참조하는 형태를 상관관계(Correlated) 서브쿼리라고 한다. QueryDSL-JPA 에서 WH..

Database 2023.10.22

JdbcTemplate을 활용하여 JPA의 saveAll() 대체하기

개요 JPA를 통해서 10만 건 이상의 데이터를 저장하는 경우 성능 이슈가 발생한다는 문의가 들어왔다. 평소에 나는 JPA로 대량의 데이터를 저장할 때에 성능적으로 문제가 있다는 사실은 알고 있었으나 그 원인을 정확히 설명하진 못했다. 이번 글에서는 위 문제를 해결하기 위한 과정을 정리해 보려고 한다. 결론부터 말하자면, 나는 JdbcTemplate의 batchUpdate() 메소드를 사용해서 문제를 해결했다. 먼저 Spring Data JPA의 saveAll()메소드의 실행 과정과 JdbcTemplate의 batchUpdate() 메소드의 실행 과정부터 알아보자. Spring Data JPA의 saveAll()메소드가 실행되는 과정 먼저 Spring Data JPA의 saveAll() 메소드가 실행되는..

Spring Jpa 2023.09.23

JPA에서 여러 종류의 영속성 관리하기

개요 JPA 기반의 애플리케이션에서 여러 개의 DB를 사용해서 개발하고 싶다는 요청이 들어왔다. 그렇다는 건, 여러 종류의 영속성을 사용하고 싶다는 의미다. 이 요구사항을 해결하기 위해서 여러 개의 Persistence-Unit을 정의하고, 그에 따라 여러 개의 EntityManagerFactory를 정의하는 과정을 진행했다. 이 과정에서 새로 알게된 내용들이 많아서 간단하게나마 정리해 보려고 한다. 먼저 JPA에서는 영속성을 관리하는 개념에 대해서 정리하고 넘어가자. JPA에서 영속성을 제어하기 위해서 필요한 구성요소 JPA에서 영속성을 관리하기 위해서는 위와 같은 구성요소가 세팅이 되어있어야 한다. 스프링부트를 사용하면 자동적으로 위와 같은 구성요소가 세팅이 된다. 구성요소 각각에 대해서 정리해 보자..

Spring Jpa 2023.08.28

대용량 작업 분산처리하기(With Spring Batch)

개요 만약 1억 건 이상의 데이터를 가공해야 하는 작업이 있다면 어떻게 처리하면 좋을까? 병렬처리를 한다고 해도 단일 서버에서 1억 건을 처리하는 것은 무리가 있다. 그렇기 때문에 여러 서버에서 분산처리하는 것이 바람직하다. 이번 글에서는 대용량 작업을 Redis Streams를 활용해서 분산처리할 수 있는 방법에 대해서 정리해보려고 한다. 필수 사전 지식 Scaling and Parallel Processing(With Spring Batch) Redis Streams 먼저 Redis Streams에서 사용할 명령어를 간단하게 정리해 보자. Redis Streams Consumer Group 생성 Redis Streams에서 컨슈머 그룹을 생성하는 명령어는 아래와 같다. XGROUP CREATE [st..

Spring Batch 2023.06.04

Scaling and Parallel Processing(With Spring Batch)

개요 Spring Batch는 대용량 데이터를 처리하는 데 최적화되어 있는 기능들을 제공하는 프레임워크다. 나는 실제로 Spring Batch를 사용해서 대용량 데이터 처리를 효율적으로 처리했다. 이번 글에서는 Spring Batch를 사용해서 대용량 데이터를 처리하는 방법에 대해서 정리해 보려고 한다. 필수 사전 지식 Spring Batch Architecture 왜 Spring Batch가 대용량 데이터 처리에 유리한가? Spring Batch가 대용량 데이터 처리에 유리한 이유는 크게 3가지다. Chunk-oriented Processing Spring Batch는 대량의 데이터를 Chunk 단위로 나누어 처리한다. 그렇기 때문에 메모리를 효율적으로 사용할 수 있다. 작업 실패 시, 실패한 Chun..

Spring Batch 2023.05.20