표현식의 가상 열로 쿼리 최적화

표현식의 가상 열은 JSON 속성의 필터와 같이 동일한 표현식을 반복적으로 평가하는 열 기반 엔진 쿼리의 속도를 높입니다. 이 기능은 PostgreSQL 16 이상에서 사용할 수 있습니다.

열 기반 엔진은 자주 사용되는 표현식의 결과를 구체화하고 캐시할 수 있습니다. AlloyDB는 이러한 결과를 미리 계산하고 저장하여 여러 쿼리에서 동일한 표현식을 반복적으로 파싱하고 평가하지 않습니다. 이 프로세스는 특히 대규모 데이터 세트의 분석 워크로드에서 쿼리 성능을 개선하고 CPU 소비를 줄입니다.

표현식의 가상 열에 대한 몇 가지 사용 사례는 다음과 같습니다.

  • JSON 속성 필터링: JSON 열 내의 특정 키-값 쌍을 기반으로 쿼리를 자주 필터링하는 경우
  • 복잡한 표현식 평가: 복잡하거나 계산 집약적인 표현식이 포함된 쿼리입니다.

표현식 스캔에 가상 열을 사용 설정하면 열 기반 엔진을 사용하고 자주 사용되는 표현식이 포함된 쿼리가 자동으로 최적화됩니다. 열 기반 엔진은 기본 열을 새로고침할 때 이러한 가상 열을 자동으로 새로고침합니다.

가상 열에서 지원되는 표현식

AlloyDB는 (프리뷰) 출시에서 JSON 및 JSONB 열에 -> 및 ->> 연산자를 지원합니다.

시작하기 전에

  1. AlloyDB 클러스터에 열 기반 엔진을 사용 설정합니다. 자세한 내용은 열 기반 엔진 구성을 참조하세요.

  2. 쿼리 통계를 사용하여 AlloyDB 쿼리에서 자주 사용되는 표현식을 식별합니다.

  3. 표현식의 기본 열을 열 기반 엔진에 추가합니다. 자세한 내용은 열 스토어 콘텐츠 수동 관리를 참고하세요.

표현식에 가상 열 사용 설정

표현식의 가상 열 지원은 기본적으로 사용 설정되어 있습니다 (google_columnar_engine.enable_virtual_columns_scan=on). 이 플래그가 이전에 사용 중지된 경우 gcloud alloydb instances update 명령어를 사용하여 인스턴스에 사용 설정할 수 있습니다.

gcloud CLI를 사용하려면 Google Cloud CLI를 설치 및 초기화하거나 Cloud Shell을 사용합니다.

gcloud alloydb instances update INSTANCE_ID \
    --region=REGION_ID \
    --cluster=CLUSTER_ID \
    --project=PROJECT_ID \
    --database-flags="google_columnar_engine.enable_virtual_columns_scan=on"

다음을 바꿉니다.

  • INSTANCE_ID: AlloyDB 인스턴스 ID입니다.
  • REGION_ID: AlloyDB 인스턴스의 리전입니다.
  • CLUSTER_ID: AlloyDB 인스턴스의 클러스터 ID입니다.
  • PROJECT_ID: Google Cloud 프로젝트 ID입니다.

세션 수준에서 이 플래그를 설정하려면 다음을 실행합니다.

SET google_columnar_engine.enable_virtual_columns_scan=on;

표현식에 가상 열 추가

열 기반 엔진에 흔히 사용되는 표현식을 추가하려면 psql 클라이언트를 사용하여 google_columnar_engine_add 함수를 호출합니다. 이러한 표현식은 데이터베이스에 이미 존재하는 열 외에도 열 기반 엔진에 열로 채워집니다.

여러 표현식을 쉼표로 구분된 값으로 지정할 수 있습니다.

    SELECT google_columnar_engine_add(
    relation => 'DB.SCHEMA.TABLE_NAME',
    columns => 'COLUMN_NAME, COLUMN_NAME',
    expressions => 'EXP1, EXP2, EXP3'
    );

다음을 바꿉니다.

  • DB.SCHEMA: 테이블이 저장된 데이터베이스 스키마입니다.
  • TABLE_NAME: 열이 저장된 테이블의 이름입니다.
  • COLUMN_NAME: 표현식이 포함된 열의 이름입니다.
  • EXP1, EXP2, EXP3: 쉼표로 구분된 표현식 목록입니다. 지원되는 JSON 추출 표현식은 -> 및 ->>입니다.

    예를 들어 public 스키마의 employee 테이블에 user ->> 'email' 및 user ->> 'name' 표현식을 추가하려면 다음 쿼리를 사용합니다.

        SELECT google_columnar_engine_add(
        relation => 'postgres.public.employee',
        expressions => '"user ->> ''email''", "user ->> ''name''"'
        );
    

    표현식 문법:

    • 전체 표현식 값을 작은따옴표로 묶습니다(예: expressions => 'EXP1,EXP2,EXP3').
    • 여러 표현식은 쉼표로 구분합니다.
    • 각 표현식을 큰따옴표로 묶습니다.
    • 다른 작은따옴표를 사용하여 표현식의 작은따옴표를 이스케이프 처리합니다.

    예를 들어 col -> 'level1' 및 col -> 'level1' ->> 'level2' 표현식을 추가하려면 다음 형식을 사용합니다.

        expressions => '"col -> ''level1''", "col -> ''level1'' ->> ''level2''"'
    

표현식의 가상 열 예시

이 예시에서는 표현식에 가상 열 기능을 사용하는 방법을 보여줍니다. profile JSONB 열이 있는 users 테이블을 만들고 샘플 데이터로 채웁니다. 그런 다음 쿼리 분석을 기반으로 google_columnar_engine_add 함수를 사용하여 자주 사용되는 profile ->> 'email' 표현식을 열 기반 엔진에 추가합니다. 그러면 열 기반 엔진은 이 빈번한 표현식을 사용하여 후속 쿼리를 최적화합니다.

이 자주 사용하는 표현식 예시를 열 기반 엔진에 추가하려면 다음 단계를 따르세요.

  1. Google Cloud 콘솔에서 클러스터 페이지로 이동합니다.

    클러스터로 이동

  2. 리소스 이름 열에서 클러스터 이름을 클릭합니다.

  3. 탐색창에서 AlloyDB Studio를 클릭합니다.

  4. profile JSONB 열이 있는 users 테이블을 만들려면 다음을 실행합니다.

    CREATE TABLE users (
    id int,
    username TEXT,
    profile JSONB
    );
    
  5. users 테이블을 샘플 데이터로 채우려면 다음을 실행합니다.

    INSERT INTO users (id, username, profile)
    SELECT
        i,
        'user' || i,
        jsonb_build_object(
            'name', 'User ' || i,
            'email', 'user' || i || '@example.com',
            'active', (i % 2 = 0)
        )
    FROM generate_series(1, 100000) AS i;
    
  6. 자주 사용되는 표현식이 포함된 쿼리의 성능을 개선하려면 열 기반 엔진에 profile ->> 'email' 표현식을 추가합니다.

    SELECT google_columnar_engine_add(
        relation => 'users',
        columns => 'username, profile',
        expressions => '"profile ->> ''email''"'
    );
    
  7. 표현식의 가상 열 기능을 사용 중지하여 성능 기준을 설정한 다음 자주 사용되는 표현식을 사용하는 쿼리를 실행하고 쿼리가 완료되는 데 걸리는 시간을 관찰합니다.

    SET google_columnar_engine.enable_virtual_columns_scan=off;
    
    SELECT username
    FROM users
    WHERE profile->>'email' = 'user50000@example.com';
    
  8. 표현식의 가상 열 기능을 사용 설정합니다.

    SET google_columnar_engine.enable_virtual_columns_scan=on;
    
  9. 자주 사용되는 표현식을 사용하는 쿼리를 다시 실행하고 쿼리가 완료되는 데 걸리는 시간을 확인합니다.

    SELECT username
    FROM users
    WHERE profile->>'email' = 'user50000@example.com';
    

표현식에 가상 열을 사용 설정하면 쿼리 런타임이 더 빨라집니다.

표현식의 가상 열 보기

특정 테이블에 추가된 모든 표현식을 찾으려면 g_columnar_virtual_columns 뷰를 쿼리합니다.

    SELECT * FROM g_columnar_virtual_columns;

출력은 다음과 비슷합니다. 여기서 description 필드는 테이블 (관계)에 추가된 모든 표현식을 보여줍니다.

category           | expression
database_name      | testdb
schemas            | {public}
relations          | {users}
description        | profile->>'email'
column_data_type   | text
status             | Usable
last_accessed_time | 2026-02-04 06:25:32.499601+00
num_times_accessed | 1

표현식의 가상 열 삭제

표현식을 삭제하려면 google_columnar_engine_drop() 함수를 호출합니다.

    SELECT google_columnar_engine_drop(
      relation => 'DB.SCHEMA.TABLE_NAME',
      expressions => 'EXP1, EXP2, EXP3'
    );

EXP1, EXP2, EXP3를 표현식을 추가할 때 사용한 것과 동일한 형식의 테이블에 있는 쉼표로 구분된 표현식 목록으로 바꿉니다.