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

Database 22

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

쿼리연습 (겹치는 날짜 검사하기)

개요 새로운 데이터를 추가할 때, 날짜별로 겹치는 데이터가 있는지 밸리데이션 하는 경우가 종종 있다. 이상하게도 나는 날짜가 겹치는지 체크하는 로직을 생각할 때 헷갈리는 경우가 많아서 이번에 그림으로 정리하고 넘어가려고 한다. 테이블 create table employee ( employee_id bigint primary key, employee_name varchar(255) not null, begin_date varchar(8) not null, end_date varchar(8) not null ); 데이터 INSERT INTO employee (employee_id, employee_name, begin_date , end_date) VALUES (1, 'Alice', '20220101' , ..

Database 2023.04.07

SQL

개요 QueryDSL 로 쿼리를 짜던중, 기본적인 SQL 쿼리 문법을 정확히 숙지하고 있지 않은 것 같아, SQL 쿼리 문법을 공부해 보려고 한다. 그룹 제어 SELECT [GROUP BY 에서 사용된 컬럼명들, 집계함수] FROM [테이블명] WHERE [조건들] GROUP BY [컬럼명들] HAVING [GROUP BY 절에 해당하는 조건들] 위의 내용은 where 절에서 만족하는 데이터들을 그룹핑하고 having 절로 조건을 걸어서 데이터를 가져온다. select 절에 사용될 컬럼들은 group by 에 명시된 컬럼들만 사용할 수 있다. group by 에 명시된 컬럼 외에 다른 컬럼을 사용하고 싶다면? -> 집계함수를 통해서 사용할 수 있다. where 절과 having 절의 가장 큰 차이점은 h..

Database 2022.05.30

프로시저

프로시저란 프로시저란 SQL Server에서 제공하는 프로그래밍 기능이다. 일반 함수가 하는 것과 거의 비슷한 일을 하고 개념도 비슷하다. 다만 이것을 DB서버측에 위치한다. 특정 작업을 수행하는, 이름이 있는 PL/SQL BLOCK 이다. 매개 변수를 받을 수 있고, 반복적으로 사용 할 수 있는 BLOCK 이다. 보통 연속 실행 또는 구현이 복잡한 트랜잭션을 수행하는 PL/SQL BLOCK을 데이터베이스에 저장하기 위해 생성한다. 쿼리문을 마치 하나의 메서드 형식으로 만들고 어떠한 동작을 일괄적으로 처리하는 용도로 사용된다. 여러 개의 칼럼을 조회하고 여러 개의 테이블을 조인하고 거기에 조건까지 넣어줌으로써 하나의 쿼리를 만드는데 엄청나게 긴 쿼리문이 생기게 된다. 이러한 여러개의 쿼리를 사용할 때마다..

Database 2022.02.27

트랜잭션 격리수준(Isolation level)

트랜잭션 격리수준 동시에 여러 트랜잭션이 처리되는 상황에서 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것을 말한다. ACID 원자성(Atomicity) : 트랜잭션은 모두 실행되거나 아예 실행되어서는 안된다. 성공적인 트랜잭션은 commit 하고 실패한 트랜잭션은 rollback 한다. 일관성(Consistency) : 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지되어야 한다. 각 트랜잭션은 일관성을 보장하도록 프로그램을 작성해야 한다. 격리성/독립성(Isolation) : 하나의 트랜잭션이 데이터를 갱신하는 동안 이 트랜잭션이 완료되기 전에 갱신중인 데이터에 다른 트랜잭션에 영향을 주지 않아야 한다. 지속성(..

Database 2022.02.27