PostgreSQL 심화 — 트랜잭션·인덱스·JSONB·파티션 · JSONB·파티션·유지보수 · 퀴즈
퀴즈: JSONB·파티션·유지보수
문항 8개. 정답과 해설은 풀어 본 뒤에 보여 드립니다.
jsonb 문서에서 shipping.country 가 'JP' 인 주문을 세려 한다. 텍스트 값을 꺼내는 연산자는?
- doc->'shipping'->>'country' 로 마지막을 ->> 로 꺼낸다
- doc#>'shipping.country' 로 점 경로를 쓴다
- doc @> 'shipping.country' 로 담김을 본다
- doc ? 'shipping' 로 키 존재만 본다
자주 조회하는 doc->'customer'->>'tier' 값을 평범한 열처럼 인덱스하고 집계하고 싶다. 알맞은 방법은?
- 조회할 때마다 뷰에서 doc 를 열어 매번 다시 계산하게 둔다
- generated always as (...) stored 생성 열로 뽑아 저장한다
- 애플리케이션에서 tier 를 계산해 별도 표에 따로 넣어 관리한다
- doc 열 전체에 일반 B 트리 인덱스를 만들어 검색한다
ts 로 RANGE 파티션한 표에서, 정의한 월 범위 어디에도 안 맞는 행은 어디로 가는가?
- 삽입이 거부되어 오류가 난다
- 가장 가까운 월 파티션에 강제로 들어간다
- DEFAULT 파티션이 있으면 거기로, 없으면 삽입이 거부된다
- 부모 표에 직접 저장된다
WHERE ts >= '2025-02-10' AND ts < '2025-02-20' 질의가 2월 파티션만 스캔하고 나머지는 계획에서 빠졌다. 이 동작의 이름은?
- 인덱스 온리 스캔
- 비트맵 스캔
- 병렬 시퀀스 스캔
- 파티션 가지치기
DEFAULT 파티션에 5월 데이터가 쌓였다. 5월 전용 파티션으로 옮기는 방법으로 알맞은 것은?
- 부모 표를 DROP 하고 처음부터 다시 만든다
- DEFAULT 를 떼고 5월 파티션을 붙인 뒤 5월 행을 옮기고 DEFAULT 를 다시 붙인다
- 5월 파티션을 만들면 DEFAULT 의 5월 행이 자동으로 옮겨진다
- 5월 행을 지웠다가 5월 파티션을 만든 뒤 다시 넣는다
한 컬럼만 UPDATE 했는데 표 크기가 커졌다. PostgreSQL 의 어떤 동작 때문인가?
- 행을 제자리에서 고치지 않고 새 버전을 쓴 뒤 옛 버전에 죽음 표시를 남긴다
- UPDATE 는 인덱스를 통째로 다시 만들기 때문에
- 숫자 컬럼이 커지면 행 전체가 큰 페이지로 옮겨지기 때문에
- UPDATE 가 WAL 을 표 안에 함께 저장하기 때문에
n_dead_tup 이 큰데 VACUUM 을 돌려도 표가 안 줄어든다. 가장 그럴듯한 이유는?
- VACUUM 은 죽은 튜플을 실제로 지우지 못하고 표시만 한다
- 죽은 튜플이 인덱스에만 있고 표에는 없다
- 아직 열려 있는 오래된 트랜잭션이 그 옛 버전을 볼 수 있어 회수가 미뤄진다
- VACUUM FULL 이 아니면 통계만 갱신하고 아무것도 안 한다
어떤 질의가 서버 시간을 가장 많이 먹는지 알려주는 pg_stat_statements 를 켜려면?
- 세션에서 SET 한 번이면 즉시 켜진다
- CREATE EXTENSION 만 하면 재시작 없이 바로 쌓인다
- 슈퍼유저로 접속하면 자동으로 활성화된다
- shared_preload_libraries 에 넣고 서버를 재시작한 뒤 확장을 만든다