PostgreSQL 18: 가상 생성 컬럼(VIRTUAL Generated Columns) 심층 분석

PostgreSQL 18 - VIRTUAL Generated Columns

작성자
발행일
2025년 11월 04일

핵심 요약

  • 1 PostgreSQL 18은 디스크 공간을 절약하며 쿼리 시점에 값을 계산하는 VIRTUAL 생성 컬럼을 도입했습니다.
  • 2 VIRTUAL 컬럼은 동적으로 계산되어 디스크에 저장되지 않으나 인덱싱이 불가능하며, STORED 컬럼은 디스크에 저장되어 인덱싱 및 빠른 조회가 가능합니다.
  • 3 성능 요구사항과 데이터 특성에 따라 VIRTUAL과 STORED 컬럼 중 적절한 전략 선택이 중요합니다.

도입

PostgreSQL 18은 혁신적인 기능인 VIRTUAL 생성 컬럼을 선보였습니다. 이 컬럼은 값을 디스크에 저장하는 대신 쿼리 시점에 즉석에서 계산하여, 개발자에게 스토리지 효율성과 쿼리 성능 사이에서 유연한 선택권을 제공합니다. 기존 PostgreSQL 12부터 지원되던 STORED 생성 컬럼과 달리, VIRTUAL 컬럼은 디스크 공간을 전혀 사용하지 않는다는 점에서 큰 차이를 보이며, PostgreSQL 18에서는 생성 컬럼의 기본값으로 설정되었습니다. 본 글에서는 VIRTUAL 생성 컬럼의 특징과 활용 방안에 대해 상세히 다룹니다.

PostgreSQL은 버전 12부터 테이블 생성 또는 변경 시 정의된 표현식에 따라 값을 자동으로 계산하는 생성 컬럼을 지원했습니다. 기존에는 STORED 방식으로 동작하여 값이 삽입/업데이트 시점에 계산되어 디스크에 물리적으로 저장되었습니다.

VIRTUAL 컬럼의 도입

PostgreSQL 18은 VIRTUAL 한정자를 도입하고 이를 생성 컬럼의 새로운 기본값으로 설정했습니다. VIRTUAL 컬럼은 필요할 때만 쿼리 시점에 값이 계산되므로 디스크 공간을 전혀 사용하지 않습니다.

VIRTUAL과 STORED 컬럼 비교

다음 users 테이블 생성 예시를 통해 두 방식의 차이를 확인할 수 있습니다. sql CREATE TABLE users ( id uuid DEFAULT uuidv7() PRIMARY KEY, email VARCHAR(100) UNIQUE NOT NULL, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, full_name_virtual VARCHAR GENERATED ALWAYS AS (first_name || ' ' || last_name) VIRTUAL, full_name_stored VARCHAR GENERATED ALWAYS AS (first_name || ' ' || last_name) STORED, full_name_indexed VARCHAR GENERATED ALWAYS AS (first_name || ' ' || last_name) STORED, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL ); CREATE INDEX users_full_name_indexed ON users (full_name_indexed); full_name_virtual은 쿼리 시점에 동적으로 계산되어 디스크에 저장되지 않으며, 인덱스 생성이 불가능합니다. 반면, full_name_storedfull_name_indexed는 디스크에 저장되며, full_name_indexed와 같이 인덱스를 생성하여 빠른 조회를 지원합니다.

올바른 전략 선택

  • VIRTUAL 사용 시점: 계산이 간단하고 빠르며, 값이 주로 화면 표시에만 필요하고 디스크 사용량을 최소화할 때 적합합니다.

  • STORED 사용 시점: 계산이 복잡하거나 비용이 많이 들고, 생성된 컬럼으로 자주 필터링하거나 정렬해야 하며, 스토리지 공간보다 쿼리 성능이 더 중요할 때 권장됩니다.

EXPLAIN ANALYZE를 통해 쿼리 성능을 분석하여 최적의 컬럼 전략을 결정할 수 있습니다.

결론

PostgreSQL 18의 VIRTUAL 생성 컬럼은 데이터베이스 설계에 있어 새로운 유연성을 제공합니다. 디스크 공간 절약이라는 이점과 함께, 쿼리 성능 요구사항을 충족시키기 위해 STORED 컬럼과 적절히 조합하여 사용하는 것이 중요합니다. 개발자는 각 컬럼의 특성을 이해하고 워크로드에 맞춰 최적의 전략을 선택함으로써, 효율적이고 고성능의 데이터베이스 애플리케이션을 구축할 수 있습니다. Hashrocket과 같은 전문 팀은 PostgreSQL 최적화 및 최신 기능 활용을 지원하여 견고한 애플리케이션 개발을 돕습니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!