Postgres 용어집
직접 실행해 볼 수 있는 SQL로 설명하는 PostgreSQL 용어
각 항목에는 짧은 정의, 기본 PostgreSQL에서 실행되는 예제, 그리고 내용의 근거가 된 공식 문서 링크가 있습니다.
행 수준 보안(RLS)
행 수준 보안을 사용하면 CREATE POLICY로 만든 정책을 통해 각 역할이 어떤 행을 보거나 변경할 수 있는지 테이블이 행 단위로 결정할 수 있습니다.
순차 스캔
순차 스캔은 테이블의 모든 행을 처음부터 끝까지 읽습니다. EXPLAIN에서는 Seq Scan으로 표시되며, 작은 테이블이나 많은 행을 반환하는 쿼리에서는 일반적인 선택입니다.
인덱스 스캔
인덱스 스캔은 인덱스로 일치하는 행을 찾은 다음 테이블에서 해당 행을 가져옵니다. EXPLAIN에서는 Index Scan으로 표시되며, Index Only Scan은 테이블 접근을 건너뛸 수 있습니다.
연결 풀링
연결 풀링은 데이터베이스 연결 여러 개를 열어 둔 채 많은 클라이언트가 공유하게 합니다. PostgreSQL에서는 연결마다 별도의 서버 프로세스가 처리하기 때문입니다.
VACUUM과 autovacuum
VACUUM은 업데이트와 삭제 후 남은 죽은 행 버전이 차지하는 공간을 회수하고, 가시성 맵을 갱신하며, 트랜잭션 ID 랩어라운드를 방지합니다. autovacuum이 이를 자동으로 실행합니다.
다중 버전 동시성 제어(MVCC)
MVCC를 사용하면 읽기와 쓰기가 동시에 실행될 수 있습니다. 각 문은 데이터의 스냅샷을 보고, 업데이트는 행을 제자리에서 덮어쓰는 대신 새 행 버전을 기록합니다.
선행 기록 로그(WAL)
선행 기록 로그는 모든 변경 사항을 데이터 파일에 반영하기 전에 기록하므로, PostgreSQL은 크래시 후에도 복구할 수 있습니다. WAL은 복제와 특정 시점 복구에도 사용됩니다.
EXPLAIN과 EXPLAIN ANALYZE
EXPLAIN은 PostgreSQL이 쿼리를 어떻게 실행할 계획인지 보여 주고, EXPLAIN ANALYZE는 쿼리를 실제로 실행해 각 단계의 실제 행 수와 소요 시간까지 보고합니다.
기본 키
기본 키는 각 행을 고유하게 식별하는 열 또는 열의 집합입니다. PostgreSQL은 고유 B-tree 인덱스와 NOT NULL로 이를 강제합니다.
외래 키
외래 키는 한 테이블의 값이 다른 테이블의 행과 일치하도록 요구하므로, 존재하지 않는 행을 가리킬 수 없습니다. ON DELETE는 참조된 행이 삭제될 때 어떻게 할지 결정합니다.
트랜잭션 격리 수준
격리 수준은 트랜잭션이 동시에 실행 중인 다른 트랜잭션의 변경 사항을 얼마나 볼 수 있는지 결정합니다. PostgreSQL의 기본값은 Read Committed이며, Repeatable Read와 Serializable도 제공합니다.
교착 상태(데드락)
교착 상태는 두 트랜잭션이 각자 상대방이 보유한 잠금을 기다릴 때 발생합니다. PostgreSQL은 이를 감지해 둘 중 하나를 취소하며, 일관된 순서로 잠금을 획득하면 이를 방지할 수 있습니다.
B-tree 인덱스
B-tree는 PostgreSQL의 기본 인덱스 유형입니다. 정렬 가능한 데이터에 대한 동등 비교와 범위 비교를 처리하며, 이미 정렬된 상태로 행을 반환할 수 있습니다.
GIN 인덱스
GIN(범용 역 인덱스)은 배열 요소, JSONB 키, 텍스트 검색 단어처럼 값 안에 있는 각 요소를 해당 요소를 포함하는 행에 매핑합니다.
부분 인덱스
부분 인덱스는 WHERE 조건에 맞는 행만 포함하므로, 쿼리가 테이블의 명확한 일부를 대상으로 할 때 작고 빠르게 유지됩니다.
공통 테이블 식(CTE)
WITH로 작성하는 공통 테이블 식은 서브쿼리에 이름을 붙여 문의 나머지 부분에서 테이블처럼 사용할 수 있게 합니다. WITH RECURSIVE는 트리와 계층 구조를 처리합니다.
JSONB 타입
jsonb는 JSON을 분해된 바이너리 형식으로 저장하므로 빠르게 쿼리할 수 있고 인덱스를 만들 수 있습니다. 대부분의 애플리케이션이 사용해야 할 JSON 타입입니다.
구체화된 뷰
구체화된 뷰는 쿼리 결과를 저장해 테이블처럼 읽을 수 있게 합니다. 읽기는 빠르지만, 데이터는 REFRESH MATERIALIZED VIEW를 실행할 때만 바뀝니다.
테이블 파티셔닝
파티셔닝은 하나의 논리적 테이블을 범위, 목록 또는 해시 기준으로 더 작은 물리적 테이블로 나누므로, 쿼리와 유지 관리 작업이 필요한 파티션만 다루게 됩니다.
업서트(INSERT ... ON CONFLICT)
INSERT ... ON CONFLICT는 행을 삽입하거나, 삽입이 고유 제약 조건을 위반하게 되면 기존 행을 업데이트하거나 건너뛰는 작업을 하나의 원자적 단계로 수행합니다.
윈도 함수
윈도 함수는 순위나 누적 합계처럼 관련된 행 집합에 걸쳐 값을 계산하지만, GROUP BY처럼 그 행들을 하나로 합치지는 않습니다.
스키마
스키마는 데이터베이스 안의 네임스페이스로, 테이블, 뷰, 함수 및 기타 객체를 담습니다. search_path는 스키마로 한정되지 않은 이름을 어디서 찾을지 결정합니다.
역할과 권한
PostgreSQL에서는 사용자와 그룹이 모두 역할입니다. GRANT는 역할에 객체에 대한 권한을 부여하며, 다른 역할의 멤버인 역할은 그 역할의 권한을 사용할 수 있습니다.
IDENTITY 열
IDENTITY 열은 암시적 시퀀스에서 값을 자동으로 받습니다. PostgreSQL에서 자동 증가 키를 만드는 SQL 표준 방식입니다.
전문 검색
전문 검색은 정확한 부분 문자열이 아니라 단어를 기준으로 문서를 매칭하며, tsvector, tsquery, @@ 연산자를 사용합니다. GIN 인덱스를 사용하면 빨라집니다.