분류 전체보기(31)
-
PostgreSQL 복합 인덱스(Composite Index) 완벽 가이드
1. 복합 인덱스(Composite Index)란?복합 인덱스(Composite Index)는 두 개 이상의 컬럼(Column)을 결합하여 생성한 인덱스입니다. 일반적으로 검색, 정렬, 조인 등의 성능 최적화를 위해 사용됩니다.예를 들어, users 테이블에서 (last_name, first_name)에 대한 복합 인덱스를 생성하면 다음과 같이 작동합니다.CREATE INDEX idx_users_last_first ON users (last_name, first_name);이제 last_name을 먼저 필터링한 후, 같은 last_name을 가진 first_name을 정렬하는 방식으로 조회 성능이 향상됩니다.2. 단일 인덱스 vs 복합 인덱스(1) 단일 인덱스단일 인덱스는 하나의 컬럼에만 적용됩니다.CR..
2025.02.16 -
PostgreSQL 조인 알고리즘 비교: 해시 조인(Hash Join), 중첩 루프 조인(Nested Loop Join), 병합 조인(Merge Join)
데이터베이스에서 조인(Join)은 가장 중요한 연산 중 하나이며, 조인 방식에 따라 성능이 크게 달라질 수 있습니다. PostgreSQL은 기본적으로 다음 세 가지 조인 알고리즘을 사용합니다해시 조인 (Hash Join)중첩 루프 조인 (Nested Loop Join)병합 조인 (Merge Join)이 글에서는 각 조인 방식의 동작 원리, 장단점, 사용 조건을 깊이 있게 분석하고, EXPLAIN ANALYZE를 활용한 실제 테스트 결과도 비교하겠습니다.1. 해시 조인 (Hash Join)원리작은 테이블(혹은 조인 키의 작은 부분 집합)을 해시 테이블(Hash Table)로 생성합니다.큰 테이블을 스캔하면서 해시 테이블을 참조하여 빠르게 조인합니다.조건등가 조인(Equal Join, = 연산자 사용)에만 ..
2025.02.16 -
PostgreSQL 성능 튜닝: ANALYZE vs EXPLAIN ANALYZE 차이점과 활용법
1. 개요PostgreSQL에서 쿼리 성능을 분석하고 최적화하는 두 가지 주요 도구가 있습니다.ANALYZE: 통계 정보를 수집하여 쿼리 플래너가 최적의 실행 계획을 선택할 수 있도록 지원EXPLAIN ANALYZE: 쿼리를 실제 실행하고, 실행 시간이 얼마나 걸리는지, 어떤 방식으로 수행되는지 분석이 두 가지는 데이터베이스 성능 튜닝에서 필수적인 역할을 합니다. 이번 포스팅에서는 ANALYZE와 EXPLAIN ANALYZE의 차이점을 살펴보고, 언제 어떤 도구를 사용해야 하는지 알아보겠습니다. 2. ANALYZE: 통계 정보 업데이트로 쿼리 최적화 📊ANALYZE란?ANALYZE는 테이블의 통계를 수집하고 PostgreSQL의 쿼리 플래너(Query Planner) 가 최적의 실행 계획을 선택할 수 ..
2025.02.16 -
Dead Tuple
PostgreSQL의 Dead Tuple과 성능 영향 분석1. Dead Tuple이란?Dead Tuple : PostgreSQL에서 삭제(DELETE)되거나 업데이트(UPDATE)된 레코드가 물리적으로 삭제되지 않고 그대로 남아 있는 데이터PostgreSQL은 MVCC(Multi-Version Concurrency Control)를 사용하기 때문에 업데이트가 발생하면 기존 데이터를 즉시 삭제하는 것이 아니라 새로운 버전을 생성하며, 이전 버전은 Dead Tuple로 남음Dead Tuple 생성 과정 예시-- 기존 데이터 삽입INSERT INTO users (id, name) VALUES (1, 'Alice');-- 데이터 업데이트 (기존 데이터를 삭제하고 새로운 데이터 삽입)UPDATE users SET..
2025.02.16 -
13. [최적화10] PostgreSQL에서 VACUUM이 필요한 이유 및 역할
VACUUM 설명1. VACUUM의 필요성PostgreSQL에서는 DELETE, UPDATE 후 데이터가 즉시 삭제되지 않음.이로 인해 Dead Tuples가 누적되면서 쿼리 성능이 저하됩니다.이를 해결하기 위해 정기적인 VACUUM 및 ANALYZE가 필요합니다.VACUUM의 역할Dead Tuples 정리 → 디스크 공간 절약쿼리 실행 속도 향상 → 불필요한 데이터를 읽지 않도록 최적화Autovacuum보다 적극적인 성능 최적화 가능VACUUM ANALYZE "user";인덱스 활용 최적화 → SET enable_seqscan = OFF; 설정 후 실행EXPLAIN ANALYZE SELECT * FROM "user" WHERE email = 'a@a.com';Index Scan 적용 확인2. VACUU..
2025.02.16 -
VACUUM 간단 정리
1. 개요PostgreSQL은 MVCC(Multi-Version Concurrency Control)을 사용하여 데이터를 관리MVCC는 트랜잭션 격리성과 동시성을 보장하는 대신, 불필요한 데이터(Dead Tuples)가 쌓이는 문제 유발이를 해결하기 위해 VACUUM을 실행해야함2. VACUUM이 필요한 이유1. MVCC로 인해 삭제된 데이터(Dead Tuples)가 계속 남아 있음PostgreSQL은 데이터를 즉시 삭제하지 않고, 기존 데이터를 ‘Dead Tuple’로 유지이는 트랜잭션 격리성과 동시성을 보장하기 위한 메커니즘예시DELETE FROM users WHERE id = 1;이때 id = 1 데이터를 즉시 삭제하는 것이 아니라, 삭제되었다고 표시된 Dead Tuple로 남아 있음트랜잭션이 롤백..
2025.02.16