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

Generated Column

~10 min · generated-columns, schema

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

계산해서 나오는 값, 자동으로

Generated column은 같은 row의 다른 컬럼으로 계산해서 만드는 컬럼이야. 종류가 둘 있어.

  • VIRTUAL — 읽을 때 계산해. 저장 공간을 더 안 써. 따로 안 적으면 이게 기본이야.
  • STORED — 쓸 때 계산해서 row에 넣어둬. 읽기가 빠른 대신 공간을 먹어.

자주 뒤지는 파생값에 쓰면 좋아. email에서 뽑은 도메인이라든가, content 덩어리의 길이라든가, JSON에서 꺼낸 필드 같은 것들. generated column에도 인덱스를 걸 수 있고, STORED면 조회가 아주 빨라져.

Tip: STORED generated column에 인덱스를 얹는 게 query 성능을 위해 파생값을 실체화하는 가장 깔끔한 방법이야. UPDATE trigger를 따로 쓸 필요가 없어. schema가 계산 규칙을 강제하니까 앞뒤 안 맞는 값이 저장될 수도 없고.

Code

Generated column — VIRTUAL + STORED·sql
CREATE TABLE users (
  id        INTEGER PRIMARY KEY,
  email     TEXT NOT NULL UNIQUE,
  email_lc  TEXT GENERATED ALWAYS AS (lower(email)) VIRTUAL,
  domain    TEXT GENERATED ALWAYS AS (substr(email, instr(email,'@')+1)) STORED
) STRICT;

-- Stored generated column 인덱싱
CREATE INDEX idx_users_domain ON users(domain);

INSERT INTO users(email) VALUES ('Alice@Gmail.com'), ('bob@example.com');

SELECT email, email_lc, domain FROM users;
-- Alice@Gmail.com | alice@gmail.com | Gmail.com
-- bob@example.com | bob@example.com | example.com

External links

Exercise

네 테이블에 generated column을 세 개 붙여봐. TEXT 컬럼을 소문자로 바꾼 것, JSON 컬럼에서 꺼낸 값 하나, 그리고 content 길이. 그중 하나에 인덱스를 걸고 EXPLAIN QUERY PLAN으로 그 컬럼을 거는 query가 인덱스를 타는지 확인해. 어느 걸 VIRTUAL로 두고 어느 걸 STORED로 둘지도 정해.

Progress

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

댓글 0

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

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