C.W.K.
Stream
Lesson 07 of 10 · published

Generated Column: STORED vs VIRTUAL

~12 min · extensions, generated

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

Derived 컬럼 두 종류

Generated 컬럼이 같은 행 다른 컬럼에서 값 도출. STORED generated 컬럼이 모든 insert/update 시 디스크 기록 — 공간 차지하지만 인덱싱 가능. VIRTUAL generated 컬럼 (PG 18+) 이 read 시 계산 — 저장 없음, 항상 최신, 인덱스 불가.

인덱스 걸 거면 STORED

VIRTUAL 컬럼 인덱싱 불가 (값 저장 안 됨). STORED 컬럼 인덱싱은 다른 컬럼처럼 동작. 결정은 보통: "이 derived 값으로 쿼리/필터/정렬 할 거?" — 예면 STORED, 아니면 VIRTUAL 이 더 쌈.

본전 뽑는 use case

  • 제목에서 계산된 slug.
  • 검색 친화 정규화 텍스트 (lowercase, 강세 제거).
  • Pre-computed total (price × quantity, before-tax + tax).
  • Full-text search 위한 tsvector (항상 STORED + GIN).

Code

STORED generated 컬럼 + 인덱스·sql
ALTER TABLE articles
ADD COLUMN slug TEXT GENERATED ALWAYS AS (
    LOWER(REGEXP_REPLACE(title, '[^a-zA-Z0-9]+', '-', 'g'))
) STORED;

CREATE INDEX articles_slug_idx ON articles (slug);

SELECT id FROM articles WHERE slug = 'pippa-quest-launch';
VIRTUAL generated 컬럼 (PG 18+)·sql
ALTER TABLE products
ADD COLUMN price_with_tax NUMERIC GENERATED ALWAYS AS (
    price * (1 + tax_rate)
) VIRTUAL;

-- 저장 비용 없음; 값 항상 현재 price/tax_rate 반영.
SELECT id, price, tax_rate, price_with_tax FROM products LIMIT 5;

External links

Exercise

현재 앱 코드에서 계산하는 값에 STORED generated 컬럼 추가 (slug, lowercase email, full name). 그거 쓰는 인덱스 추가. 앱측 접근 대비 쿼리 속도 비교.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.