728x90

SQL 18

SQL: 인덱스

※ SQL: Index. 안녕하세요. 듀스트림입니다. 오늘 포스팅은 DBMS 옵티마이저는 '어떤 SQL에 인덱스가 필요하다고 판단하는지'와 '인덱스 최적화가 무엇인지'에 대해 정리한 이론적인 내용입니다. 한 번쯤 읽어두시면 도움이 될 거라고 확신합니다. (예시는 PostgreSQL이 대부분입니다.)1. 왜 인덱스는 빠를까요? - 비용모형 관점대부분의 RDBMS는 비용 기반 옵티마이저(CBO) 로 실행계획을 고릅니다.비용은 대략 “디스크 페이지 읽기 + CPU 비교·연산 + 정렬/조인”의 합산으로 추정합니다.PostgreSQL은 seq_page_cost·random_page_cost 등 상수에 기반해 페이지 접근 비용을 모델링하고, MySQL은 server_cost/engine_cost 테이블로 조정 가능..

SQL 2025.09.14

ANSI SQL: FOR UPDATE

※ ANSI SQL: FOR UPDATE. 안녕하세요. 듀스트림입니다. 오늘 포스팅은 동시성 제어를 위한 구문인 FOR UPDATE에 대한 내용입니다.FOR UPDATE는 동시성 제어(Concurrency Control)를 위한 구문으로ANSI SQL 표준 기준에서도 정의되어 있습니다.이 기능은 주로 SELECT 쿼리 결과에 포함된 행들을 업데이트하거나 삭제할 계획이 있을 때,다른 트랜잭션이 해당 행에 대해 변경하지 못하도록 잠금을 거는 데 사용됩니다.1. ANSI SQL 표준 기준 문법SELECT column_listFROM table_name[WHERE 조건]FOR UPDATE [OF column1, column2, ...]FOR UPDATE: 선택한 행들에 행 수준(Row-level) 잠금(Lock..

SQL 2025.08.01

ANSI SQL: LATERAL

※ ANSI SQL LATERAL. 안녕하세요. 듀스트림입니다. 오늘의 포스팅은 ANSI SQL:1999 표준부터 도입된 기능인 LATERAL JOIN을 PostgreSQL 관점에서 작성한 내용입니다.1. LATERAL?LATERAL 키워드는 FROM 절에서 서브쿼리나 테이블 함수가 앞선 테이블의 컬럼을 참조할 수 있도록 허용합니다.이를 통해 서브쿼리나 테이블 함수는 각 행에 대해 독립적으로 실행되어, 외부 쿼리의 컬럼 값을 동적으로 사용할 수 있습니다.즉, LATERAL을 사용하면 서브쿼리나 함수가 외부 쿼리의 컬럼을 참조하여 계산을 수행할 수 있게 됩니다.요약하자면,• LATERAL은 상관 서브쿼리(correlated subquery) 개념을 FROM 절에서 사용할 수 있게 해주는 기능입니다.• LA..

SQL 2025.05.19

ANSI SQL: 윈도우 함수 LAG()

※ ANSI SQL Standard Window Function LAG(). 안녕하세요. 듀스트림입니다. 오늘의 포스팅은 오랜만에 SQL 관련이에요.ANSI 표준 윈도우 함수인 LAG()에 대해 한번 알아보겠습니다. 이걸 어디다 쓰냐고요? 이제 어떤 시스템을 만들었을 때 정산 관련 처리를 해야 되잖아요? 거기에도 사용하고, 주식 종가 대비 변화율 계산과 어떤 데이터의 변화 시점 추적 등에 사용합니다. (시계열 데이터나 순차적인 데이터에서 이전 값과의 비교나 차이를 계산할 때 사용)1. LAG() 함수란?ANSI 표준 윈도우 함수(Window Function) 중 하나로, 이전 행의 값을 현재 행에서 참조할 수 있게 해주는 함수입니다 문법은 아래와 같습니다.LAG(value_expression [, off..

SQL 2025.05.08

ANSI SQL: CTE와 서브쿼리 비교

※ ANSI SQL: CTE vs. Subquery Comparison. 안녕하세요. 듀스트림입니다. 새해 복 많이 받으세요. 2025년의 첫 포스팅은 많이 사용되는 CTE(Common Table Expression)와 서브쿼리(Subquery)의 차이를 살펴보도록 하겠습니다.1. CTE와 서브쿼리의 차이점항목CTE서브쿼리가독성직관적복잡한 구조일수록 어려워짐재사용성동일 CTE를 여러 번 참조 가능재사용 불가디버깅 용이성각 CTE 단위로 결과를 쉽게 디버깅 가능서브쿼리 단위로 디버깅하기는 어려움성능반복 참조가 필요한 경우 우수단순 필터링, 작은 데이터 셋, 중첩 구조가 단순한 경우 우수코드 구조명시적으로 분리된 블록 구조메인 쿼리 내에 포함되어 복잡해질 수 있음사용 목적반복적 참조 및 복잡한 쿼리 단순화단..

SQL 2025.01.02

PostgreSQL(ANSI SQL): LEFT JOIN ... IS NULL과 NOT EXISTS의 차이

※ PostgreSQL: LEFT JOIN ... IS NULL vs NOT EXISTS — What's the Difference? 안녕하세요. 듀스트림입니다. 오늘은 LEFT JOIN ... IS NULL과 NOT EXISTS는 어떤 차이가 있고 어떻게 동작하는지 더 깊게 알아보겠습니다. 차이점을 표로 먼저 보여드리겠습니다.항목LEFT JOIN ... IS NULLNOT EXISTS동작 방식조인 결과에서 NULL 값을 확인서브쿼리를 통해 조건 불만족 여부 확인성능큰 데이터셋에서 조인으로 데이터 크기 증가 가능조건이 적은 경우 효율적일 가능성 있음가독성비교적 간단하나 큰 데이터셋에서는 복잡해질 수 있음직관적으로 이해 가능사용 예시외부 조인 결과에서 매칭되지 않는 데이터 확인특정 조건에 맞는 데이터가 존..

SQL 2024.12.23

PostgreSQL 쿼리 튜닝: LEFT JOIN ... IS NULL → NOT EXISTS로 변환, 인덱스 활용

※ Transforming LEFT JOIN ... IS NULL to NOT EXISTS for Better Index Utilization in PostgreSQL. 안녕하세요. 듀스트림입니다. 오늘 포스팅은 오랜만에 쿼리 튜닝 사례입니다. 이번 사례는 LEFT JOIN ... NULL 필터링을 NOT EXISTS로 변환하고, 인덱스를 추가하여 성능 최적화한 사례입니다.최적화 결과, 실제 운영 쿼리 성능이 약 2배 정도 향상되었습니다. 주요 포인트는 다음과 같습니다.1. LEFT JOIN ... IS NULL → NOT EXISTS로 조인 방식을 변경하여 조인 비용 감소와 락 경합 발생 최소화2. 필터 조건에 맞는 인덱스 추가로 데이터 접근 방식 최적화: Seq Scan(전체 스캔) → Bitmap ..

SQL 2024.12.20

PostgreSQL 쿼리 튜닝: INSERT INTO → CTAS로 5배 성능 향상

※ Converting INSERT INTO to CTAS for PostgreSQL Query Optimization 안녕하세요. 듀스트림입니다. 오늘은 쿼리 튜닝 사례를 하나 가져왔습니다.기존 INSERT INTO 문으로 만들어져 있는 쿼리를 CTAS(Create Table As Select) + INSERT INTO로 병렬 처리 가능하게 최적화하여 성능 개선한 사례입니다. 주요 포인트는 다음과 같습니다.1. PostgreSQL은 병렬 INSERT를 지원하지 않습니다.2. CTAS는 병렬 처리를 지원합니다. (SELECT ... INTO도 병렬 지원)3. max_parallel_workers, max_parallel_workers_per_gather 파라미터가 적절하게 설정되어 있어야 합니다.4. 상..

SQL 2024.12.13
728x90