본문 바로가기
C.W.K.
Stream
Lesson 07 of 10 · published

생성 열: STORED와 VIRTUAL

~12 min · extensions, generated

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

같은 행의 값에서 자동으로 계산해

생성 열은 다른 열을 바탕으로 값을 만들고 직접 INSERT하거나 UPDATE할 수 없어. 계산 규칙을 데이터베이스 한 곳에서 지킬 수 있어.

색인이 필요하면 STORED

STORED는 쓰기 때 계산해 디스크에 저장하므로 공간을 쓰지만 색인을 만들 수 있어. PG 18부터의 VIRTUAL은 읽을 때 계산해 저장 공간을 쓰지 않지만 색인을 만들 수 없어.

질의하는 파생값인지 물어봐

slug와 정규화한 이메일처럼 자주 찾거나 정렬하는 값은 STORED가 맞고, 전문 검색용 tsvector는 STORED 생성 열과 GIN 색인을 함께 써. 표시할 때만 필요한 세금 포함 가격이라면 VIRTUAL이 가벼울 수 있어.

Code

STORED 생성 열과 색인·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 생성 열 (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 생성 열을 추가해. 그 열에 색인을 만들고 앱에서 계산하던 방식과 질의 속도를 비교해.

Progress

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

댓글 0

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

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