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

이 페이지에서는 열 기반 엔진의 표현식에 가상 열을 사용하여 쿼리를 가속화하는 방법을 설명합니다.

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

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

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

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

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

AlloyDB는 (미리보기) 출시에서 JSON 및 JSONB 열에 대한 ->->> 연산자를 지원합니다.

시작하기 전에

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

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

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

표현식의 가상 열 사용 설정

gcloud beta alloydb instances update 명령어를 사용하여 인스턴스의 표현식에 대한 가상 열 지원을 사용 설정할 수 있습니다.

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

    gcloud beta alloydb instances update INSTANCE_ID \
        --region=REGION_ID \
        --cluster=CLUSTER_ID \
        --project=PROJECT_ID \
        --update-mode=INPLACE \
        --add-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 테이블을 만들고 샘플 데이터로 채웁니다. 그런 다음 쿼리 분석을 기반으로 자주 사용되는 profile ->> 'email' 표현식을 google_columnar_engine_add 함수를 사용하여 열 기반 엔진에 추가합니다. 그런 다음 열 기반 엔진은 이 자주 사용되는 표현식을 사용하여 후속 쿼리를 최적화합니다.

이 예시의 빈번한 표현식을 열 형식 엔진에 추가하려면 다음 단계를 따르세요.

  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. 빈번한 표현식을 사용하는 쿼리를 실행하고 쿼리가 완료되는 데 걸리는 시간을 확인합니다.

    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 필드에는 테이블 (관계)에 추가된 모든 표현식이 표시됩니다.

SELECT * FROM g_columnar_virtual_columns;
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을 표현식을 추가할 때 사용한 것과 동일한 형식의 테이블에 있는 쉼표로 구분된 표현식 목록으로 바꿉니다.