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

전체 글 224

조인 최적화 (With PostgreSQL)

개요 나는 단일 테이블에 대한 쿼리에서의 인덱스 동작 방식은 잘 알고있다. 하지만 조인이 들어간 쿼리에서는 인덱스 설계를 잘 하지 못하는 경우가 있었다. 그래서 이번 글에서는 조인에서 인덱스가 어떻게 사용되는지를 정리해 보려고 한다. PostgreSQL의 옵티마이저는 조인을 처리하기 위해서 NL 조인, Hash Join, Merge Join을 선택한다. 여기서 개발자가 최적화할 수 있는 조인 방식은 NL 조인인것 같다. NL 조인으로 사용될 수 없는 경우, 옵티마이저가 알아서 Hash Join, Merge Join으로 실행계획을 수립한다. 그렇기 때문에 이번 글에서는 NL 조인에서의 인덱스 설계 방법에 대해서 정리해 볼 것이다. 필수 사전 지식 인덱스 (In PostgreSQL) PostgreSQL 실행..

Database 2023.12.30

인덱스를 활용한 Sort 오퍼레이션 생략하기 (With PostgreSQL)

개요 인덱스는 이미 정렬된 자료구조다. 그렇기 때문에 정렬작업인 Sort 오퍼레이션을 생략할 수 있다. Sort 오퍼레이션이 발생하는 경우는 크게 Order By 수행 Group By 수행 필수 사전 지식 인덱스 (In PostgreSQL) PostgreSQL 실행계획 분석하기 4편 (Sort, Limit) PostgreSQL 실행계획 분석하기 5편 (Aggregates) 테이블 및 데이터 세팅 테이블 생성 create table employee ( employee_id bigint generated by default as identity constraint employee_pkey primary key, begin_date varchar(8), employee_name varchar(255), end..

Database 2023.12.27

PostgreSQL의 메모리 레이아웃과 데이터를 읽어오는 과정

개요 서버의 가장 중요한 역할은 효율적으로 데이터를 관리하는 데 있다고 생각한다. 그러므로 데이터가 어떻게 관리되고, 클라이언트에게 어떠한 과정을 거쳐 데이터를 전달하는지를 이해하는 것은 매우 중요하다. 이번 글에서는 PostgreSQL의 메모리 레이아웃과 데이터를 읽어오는 과정에 대해 알아보고자 한다. 먼저 PostgreSQL에서의 메모리 레이아웃부터 살펴보자 Logical Layout 과 Physical Layout PostgreSQL의 Logical Layout과 Physical Layout을 비교해 보자. 이전 글(PostgreSQL Logical Structure)에서 알아보았듯이 Tablespace 별로 여러 데이터 베이스의 테이블이 구성된다. 또한, 실제 데이터베이스는 $PGDATA/base..

Database 2023.12.19

PostgreSQL Logical Structure 이해하기

개요 이번 글에서는 PostgreSQL의 Logical Structure에 대해서 정리해보려고 한다. DBMS마다 약간씩 Structure가 다르기 때문에 이번 글에서는 PostgreSQL에 초점을 맞춰서 설명해 보려고 한다. PostgreSQL Logical Structure PostgreSQL Logical Structure를 정리하면 아래와 같다. 이제 각각의 구성요소에 대해서 정리해 보자. 데이터베이스 클러스터 PostgreSQL은 여러 개의 데이터베이스와 Role, 테이블스페이스의 집합이다. 각 클러스터는 고유한 포트 번호와 시스템 카탈로그를 가지며, 서로 다른 클러스터의 데이터베이스들은 독립적으로 작동한다. 데이터베이스 클러스터가 생성되면 PGDATA 라는 환경변수가 생기는데, 해당 환경변수에..

Database 2023.12.11

PostgreSQL 아키텍처 이해하기

개요 2년 넘게 PostgreSQL을 사용하면서 PostgreSQL의 아키텍처에 대해서 전혀 알지 못했다. RDBMS와 같은 복잡한 시스템에서는 아키텍처의 이해가 성능 최적화와 효율적으로 관리하는데 큰 도움이 된다. 그래서 이번 글에서는 PostgreSQL에 대해서 간단히 정리해보려고 한다. PostgreSQL 아키텍처 PostgreSQL의 아키텍처는 아래와 같다. PostgreSQL 구조는 물리적인 관점에서 보면, Shared Memory, 프로세스, 데이터 파일(또는 테이블 스페이스)로 구성된다. 공유 메모리의 주요 요소는 Shared Buffer와 WAL 버퍼이다. (Commit Log를 비롯한 나머지 구성요소는 위 그림에서 생략되었다.) 프로세스는 Postgres 프로세스, 백그라운드 프로세스, ..

Database 2023.12.08

서브쿼리 변환하기 2편 (With Java, QueryDSL)

개요 이전 글에서는 서브쿼리를 변환하는 방법을 알아보았고, 성능적으로 어떠한 차이가 있는지 알아보았다. 이번 글에서는 실무에서 자주 등장하는 서브쿼리 형태에 대해서 알아보고, 해당 쿼리를 어떠한 방식으로 처리하는 게 효율적인지 정리해 보려고 한다. 필수 사전 지식 서브쿼리(with QueryDsl) 서브쿼리 변환하기 1편(이론) 아래와 같은 문제는 내가 자주 접했던 유형의 쿼리 형태이다. 문제 orders 테이블과 order_details 테이블이 있습니다. 주문 정보와 각 주문에 대해 가장 마지막에 등록된 주문상세의 생성일자를 조회하라. 만약, 등록된 일자가 같은 경우, order_detail_id가 가장 큰 값의 생성일자를 조회하라. 테이블 정보 orders create table orders ( o..

Database 2023.11.26

서브쿼리 변환하기 1편 (이론)

개요 종종 상황에 따라 서브쿼리를 변환해야 하는 일이 있다. 예를 들어서, QueryDSL-JPA를 사용하면, From절에 서브쿼리를 지원하지 않기 때문에 Where절의 서브쿼리로 변환해야 한다. 하지만 서브쿼리의 동작원리를 잘 알지 못하면, 성능이 급격히 안 좋아질 수 있다. 그래서 이번글에서는 서브쿼리를 변환하는 방법과 변환했을 때의 성능적인 차이에 대해서 정리해보려고 한다. 필수 사전 지식 서브쿼리(with QueryDsl) PostgreSQL 실행계획 분석하기 1편 (실행계획 읽는 방법) PostgreSQL 실행계획 분석하기 2편 (Table Scan) PostgreSQL 실행계획 분석하기 3편 (Join Methods) PostgreSQL 실행계획 분석하기 6편 (서브쿼리) 이저 본격적으로 서브..

Database 2023.11.26

PostgreSQL 실행계획 분석하기 6편 (서브쿼리)

개요 실무에서 종종 서브쿼리를 사용한다. 하지만 서브쿼리는 잘 알고 사용하지 않으면 비효율적으로 동작할 확률이 높다. 그래서 이번 글에서는 PostgreSQL 옵티마이저가 서브쿼리를 처리하는 방법에 대해서 알아보려고 한다. 옵티마이저는 크게 아래 3가지 방법으로 서브쿼리를 처리한다. 필터 방식 (Subplan) 세미 조인 서브쿼리 Collapse (서브쿼리 병합) 이제 본격적으로 위에서 언급한 3가지 처리방식을 알아보자. 필수 사전 지식 PostgreSQL 옵티마이저 PostgreSQL 실행계획 분석하기 1편 (실행계획 읽는 방법) PostgreSQL 실행계획 분석하기 2편 (Table Scan) PostgreSQL 실행계획 분석하기 3편 (Join Methods) PostgreSQL 실행계획 분석하기 ..

Database 2023.11.25

PostgreSQL 실행계획 분석하기 5편 (Aggregates)

개요 실무에서 자주 등장하는 Aggregate 오퍼레이션의 종류는 크게 세가지 이다. Aggregate HashAggregate GroupAggregate Aggregate는 SUM(), AVG(), COUNT(), MAX(), MIN()와 같은 집계 함수를 처리할 때 주로 등장한다. HashAggregate와 GroupAggregate는 Group By를 할 때에 주로 등장한다. 이번 글에서는 위 세가지 Aggregate 오퍼레이션에 대해서 정리해 보려고 한다. 필수 사전 지식 PostgreSQL 옵티마이저 PostgreSQL 실행계획 분석하기 1편 (실행계획 읽는 방법) 테이블 생성 먼저, 테스트를 위해 아래와 같이 테이블을 만든다. CREATE TABLE aggregates_test_table ( ..

Database 2023.11.25

PostgreSQL 실행계획 분석하기 4편 (Sort, Limit)

개요 Sort, Limit 연산은 실행계획에서 자주 등장한다. 그렇기 때문에 어떤 경우에 Sort와 Limit 연산이 발생하는지 짚고 넘어가려고 한다. 필수 사전 지식 PostgreSQL 옵티마이저 PostgreSQL 실행계획 분석하기 1편 (실행계획 읽는 방법) 테이블 세팅 create table team ( team_id bigint, team_name varchar(100), created_at timestamp with time zone ); 데이터 세팅 INSERT INTO team (team_id, team_name, created_at) SELECT i, 'Team ' || i, CURRENT_TIMESTAMP - INTERVAL '1 day' * (i % 365) FROM generate_..

Database 2023.11.22