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

Foreign Key 인덱싱

~10 min · indexes, foreign-keys

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

가장 흔한 누락 인덱스

PostgreSQL 이 PK 와 unique 제약에 자동 인덱스. FK 엔 안 함. 이게 팀들 계속 잡음: FK 컬럼 쿼리 느림, 더 나쁜 건 모든 부모 DELETE 가 자식 테이블 전체 스캔해서 참조 찾음.

항상 이렇게

모든 ... REFERENCES parent(id) 마다 매치 인덱스 추가. 너무 일관돼서 FK 선언과 같은 마이그레이션에 인덱스 추가 — 절대 따로 안 함.

인덱스 없는 FK 찾는 법

한 catalog 쿼리가 참조 컬럼에 인덱스 없는 모든 FK 드러냄. 운영하는 모든 DB 에 실행.

Code

FK + 인덱스 항상 짝·sql
CREATE TABLE orders (
    id          INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    customer_id INTEGER NOT NULL REFERENCES customers(id) ON DELETE RESTRICT,
    placed_at   TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE INDEX orders_customer_id_idx ON orders (customer_id);
인덱스 누락된 FK 찾기·sql
SELECT
    c.conrelid::regclass AS table_name,
    string_agg(a.attname, ', ') AS columns
FROM   pg_constraint c
JOIN   pg_attribute a ON a.attrelid = c.conrelid AND a.attnum = ANY(c.conkey)
WHERE  c.contype = 'f'
GROUP  BY c.oid, c.conrelid
HAVING NOT EXISTS (
    SELECT 1
    FROM   pg_index i
    WHERE  i.indrelid = c.conrelid
      AND  (c.conkey::int[]) <@ (i.indkey::int[])
);
-- 참조 컬럼이 어느 인덱스에도 안 덮인 모든 FK 반환.

External links

Exercise

실제 DB 에 위 catalog 쿼리 실행. 인덱스 없는 모든 FK 마다 추가할지 결정. 대부분 인덱스 받아야 함; 드문 예외 (행 삭제 절대 없는 lookup 테이블) 는 그대로.

Progress

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

댓글 0

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

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