728x90

SQL 19

SQL: 날짜 조건 최적화

※ SQL: Date Condition Optimization. 안녕하세요. 듀스트림입니다. 오랜만에 튜닝 사례를 가져왔습니다. 운영 중 긴급 배포된 쿼리로 인해 Disk I/O 사용률이 장시간 100%로 유지되는 문제가 발생했습니다. 원인을 확인해보니, 날짜 조건에 TO_CHAR() 함수가 사용되고 있었습니다.그 결과 대량의 데이터 스캔이 발생했고, 읽기 병목으로 이어졌습니다. 1. AS-IS (문제 상황)문제가 된 조건은 다음과 같습니다.-- 1번 쿼리 조건절TO_CHAR(created_at, 'YYYY-MM-DD') = '2026-04-13'-- 2번 쿼리 조인 조건절TO_CHAR(a.created_at, 'YYYY-MM-DD') = TO_CHAR(b.created_at, 'YYYY-MM-DD')c..

SQL 2026.04.20

SQL: 윈도우 함수 문법 구조

※ SQL: Window Function Syntax Structure. 안녕하세요. 듀스트림입니다. 또다시 월요일입니다. 오늘 포스팅은 SQL을 다룬다면, 필수적으로 이해하고 있어야 하는 윈도우 함수의 문법 구조에 대해 알아보겠습니다.1. 윈도우 함수의 기본 문법 구조Window-function ( [expression] ) OVER ( [PARTITION BY ...] [ORDER BY ...] [ROWS | RANGE ...]) 한 줄로 표현하면 아래와 같은 구조로 되어있습니다.윈도우 함수 = 함수 + OVER(윈도우 정의)윈도우 함수 자체: SUM(), AVG(), ROW_NUMBER(), LAG(), LEAD() 등OVER() 안의 윈도우 정의: 어떤 범위(window..

SQL 2025.11.24

SQL: 행 스트림

※ SQL: Row Stream. 안녕하세요. 듀스트림입니다. 오늘은 SQL 엔진에서 하는 행 스트림 처리가 무엇인지에 대해 알아보겠습니다.카테고리를 DBMS에 넣을지 SQL에 넣을지 고민했지만, 그냥 SQL에 넣기로 했습니다.글을 작성하다 보면 내용보다는 의외로 이런 부분에서 로딩이 더 걸리는 것 같습니다. SQL 엔진에서 "행 스트림(row stream)" 이란 표현은 테이블의 모든 데이터를 한꺼번에 메모리에 올려놓지 않고, 한 행(row)씩(또는 일정한 묶음 단위로) 순차적으로 읽고 전달하는 처리 방식을 말합니다.즉, LATERAL이나 Nested Loop 같은 연산이 "행 스트림 기반(row stream based)"으로 동작한다는 건 아래처럼 이해하시면 됩니다.1. 행 스트림 처리?SQL의 실행..

SQL 2025.11.17

SQL: 상관관계(상관 서브쿼리)

※ SQL: Correlation. (Correlated subquery) 안녕하세요. 듀스트림입니다. 오늘 포스팅은 상관 서브쿼리에 관련된 내용입니다.SQL에서 상관관계(Correlation)란?주로 상관 서브쿼리(correlated subquery)를 의미하며,"서브쿼리가 실행될 때, 바깥 쿼리의 컬럼을 참조하는 관계"를 말합니다.즉, 서브쿼리가 독립적으로 실행되지 못하고,외부 쿼리의 각 행에 대해 내부 쿼리가 반복적으로 실행되는 구조를 의미합니다.1. 비상관 서브쿼리 (Non-correlated Subquery) 서브쿼리가 독립적으로 실행 가능합니다.SELECT emp_name, salaryFROM empWHERE salary > (SELECT AVG(salary) FROM emp);(SELECT ..

SQL 2025.10.27

SQL: 실행 순서

※ SQL: Order of Execution. 안녕하세요. 듀스트림입니다. 오늘은 초급 개발자분들이 보시면 많은 도움이 될 내용인 SQL 실행 순서에 대한 내용입니다.1. 우리가 코드로 작성할 때 사용하는 문법적 순서SELECT → FROM →JOIN→ON→WHERE → GROUP BY → HAVING → ORDER BY → LIMIT2. 실행 순서 (논리적 평가 순서)FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → (WINDOW) → DISTINCT → ORDER BY → LIMIT ※ LATERAL은 FROM 평가 중에 실행됩니다.3. 물리적 실행 순서(실행계획)옵티마이저가 실제로 선택한 방식(NL/Hash/Sort 등).→ 물리적 실행은 최적화를..

SQL 2025.10.24

SQL: EXISTS / NOT EXISTS

※ SQL: EXISTS / NOT EXISTS. 안녕하세요. 듀스트림입니다. 오늘 포스팅은 predicate 구문인 EXISTS / NOT EXISTS에 대한 내용입니다.Predicate 구문?• SQL에서 TRUE / FALSE / UNKNOWN 중 하나로 평가되는 논리식(logical expression)을 뜻합니다.• WHERE, HAVING, ON 절 안에서 사용되어 어떤 행을 선택(필터링) 할지를 결정합니다.※ ON절은 문법적으로 가능은 하지만 의미적으로 맞지 않아 실제로 사용하지는 않습니다.1. EXISTS / NOT EXISTSEXISTS / NOT EXISTS는 "조건이 참인가?"를 판별하는 불리언 평가식(Boolean predicate)이고 데이터를 반환하지 않습니다. EXISTS:..

SQL 2025.10.15

SQL: ASC, DESC

※ SQL: ASC, DESC. 안녕하세요. 듀스트림입니다. 오늘 포스팅은 반드시 꼭! 알아야 되는 정렬 순서에 대한 내용입니다. ASC와 DESC는 SQL에서 정렬 순서(ordering direction) 를 지정할 때 사용하는 키워드입니다.보통 ORDER BY 절과 함께 사용되며, 결과를 오름차순(ascending) 또는 내림차순(descending)으로 정렬합니다.1. ASC (Ascending Order)의미: 오름차순 정렬 (작은 값 → 큰 값)숫자: 1, 2, 3, 4 …문자: A, B, C …날짜: 오래된 날짜 → 최근 날짜기본값이므로 ASC는 생략해도 동일하게 동작합니다.SELECT name, ageFROM employeeORDER BY age ASC;-- 아래처럼 생략해도 동일한 의미입니..

SQL 2025.10.13

SQL: ROLLUP

※ SQL: ROLLUP. 안녕하세요. 듀스트림입니다. 오늘은 제가 애용하는 함수인 ROLLUP에 대한 내용입니다. 주로 수행 이력 건 수 체크, 오브젝트 집계, 유저 상태별 집계 등에 사용 중입니다.ROLLUP은 GROUP BY의 확장 기능으로, 계층적으로 집계 결과를 한 번에 구할 때 사용합니다.1. 기본 구문SELECT 컬럼1, 컬럼2, 집계함수FROM 테이블GROUP BY ROLLUP(컬럼1, 컬럼2); 먼저 컬럼1, 컬럼2 별 집계를 하고,그 다음 컬럼1 별 집계,마지막으로 전체 합계를 출력합니다.2. 매출 집계SELECT region, product, SUM(sales) AS total_salesFROM salesGROUP BY ROLLUP(region, product)ORDER BY regi..

SQL 2025.09.29

SQL: 인라인뷰

※ SQL: Inline view. 안녕하세요. 듀스트림입니다. 기본기도 중요하죠.그래서 하나씩 작성해보려고 합니다. 오늘 주제는 인라인뷰입니다.인라인뷰(inline view)는 FROM 절 안에 작성된 서브쿼리를 의미합니다.1. 기본 예시SELECT emp.emp_id, emp.emp_name, dept.dept_nameFROM ( SELECT employee_id AS emp_id, employee_name AS emp_name, department_id FROM employees WHERE salary > 5000) empJOIN departments dept ON emp.department_id = dept.department_id;employees 테이블에서 급여가 5000 이..

SQL 2025.09.26

SQL: 슬로우 쿼리 패턴

※ SQL: Slow Query Patterns. 안녕하세요. 듀스트림입니다. 요즘 그냥 순간순간이 퀘스트의 연속입니다.정보보호 심사 시즌도 시작해서 하루에 n개씩 처리해도 퀘스트가 계속 쌓이고 있습니다.그래도 일할 때는 바쁜 게 재밌습니다. (물론 휴식도 매우 중요합니다.) 오늘 포스팅에서는 어렵지 않지만, 꼭 알아야 하는 슬로우 쿼리 패턴에 대해 정리해 보겠습니다.1. 데이터 접근 패턴 관련풀 테이블 스캔 (Full Table Scan)인덱스를 활용하지 못하고 전체 데이터를 읽는 경우.(예: WHERE 조건에 함수 적용, 타입 불일치, 와일드카드 %값)비효율적인 조인 (Join)큰 테이블끼리의 Nested Loop Join조인 조건에 인덱스가 없어 Hash Join → Disk Spill 발생.다대다..

SQL 2025.09.24
728x90