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

Expression 인덱스

~12 min · indexes, expression

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

컬럼 아닌 계산 인덱스

Expression 인덱스가 표현식 결과 인덱스. CREATE INDEX ... ON users (LOWER(email)) 이 lowercase 형태 인덱스. 이제 WHERE LOWER(email) = 'x' 가 인덱스 사용 가능 — expression 인덱스 없으면 그 쿼리는 sequential scan 운명.

흔한 응용

  • 대소문자 무시 lookup: LOWER(email), UPPER(sku).
  • JSONB 필드 접근: (payload->>'user_id') 인덱스.
  • 연결: (first_name || ' ' || last_name) 인덱스.
  • 날짜 truncation: 'by-day' 쿼리 위한 DATE(timestamp_col) 인덱스.

비용

관련 컬럼 건드리는 모든 INSERT 와 UPDATE 에서 표현식 평가. 비싼 표현식은 insert 오버헤드 추가. 싼 거 (LOWER, json 필드 접근) 는 본질적으로 공짜.

Code

대소문자 무시 email lookup·sql
CREATE INDEX users_email_lower_idx ON users (LOWER(email));

-- 이제 인덱스 사용
SELECT * FROM users WHERE LOWER(email) = 'alice@example.com';

-- 더 좋음: lowercase 를 generated column 에 저장 + 그거 인덱스
ALTER TABLE users
ADD COLUMN email_lower TEXT GENERATED ALWAYS AS (LOWER(email)) STORED;

CREATE INDEX users_email_lower_gen_idx ON users (email_lower);
JSONB 필드 인덱스·sql
-- JSONB 컬럼 안 단일 필드 인덱스
CREATE INDEX events_user_id_idx ON events ((data->>'user_id'));

-- 이제 빠름
SELECT * FROM events WHERE data->>'user_id' = '42';
연결 full-name 검색·sql
CREATE INDEX users_full_name_idx
ON users ((first_name || ' ' || last_name));

SELECT * FROM users
WHERE  first_name || ' ' || last_name = 'Ada Lovelace';

External links

Exercise

프로젝트에 컬럼을 함수로 감싸는 쿼리 찾기 (LOWER, DATE, ->>) — plain 인덱스 절대 못 씀. 매치하는 expression 인덱스 추가; EXPLAIN 으로 속도 향상 확인.

Progress

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

댓글 0

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

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