학습 내용

Snowflake에서 Klaviyo의 데이터 웨어하우스 내보내기가 데이터를 쓰는 KLAVIYO_PROFILE 테이블을 표준 테이블에서 Snowflake 하이브리드 테이블로 변환하는 방법과, 각 단계에서 실행할 정확한 명령어를 알아보세요.

Klaviyo의 내보내기 동기화는 주기적으로 실행될 때마다 KLAVIYO_PROFILE에 MERGE(업서트)로 기록돼요. 하이브리드 테이블은 지연 시간이 짧고 인덱스 기반의 포인트 읽기 및 쓰기를 위해 만들어진 Snowflake 테이블 유형이라, 변환하면 이러한 MERGE 작업의 시간과 비용이 줄어들어요. 이는 이후에 테이블을 어떻게 읽는지와 무관하게 적용되므로, 다운스트림에서 대규모 분석 스캔과 집계를 실행하기만 하더라도 수행할 가치가 있어요. 애플리케이션, API 또는 UI에 개별 프로필 조회를 제공하기 위해 KLAVIYO_PROFILE도 사용한다면, 하이브리드 테이블은 이러한 조회도 더 빠르게 반환해요.

Klaviyo 고급 데이터 플랫폼은 Klaviyo의 표준 마케팅 애플리케이션에 포함되어 있지 않으며, 관련 기능에 액세스하려면 구독이 필요합니다. 이 요금제를 구매하는 방법을 알아보려면 청구 가이드를 확인해 주세요.

하이브리드 테이블은 Klaviyo 기능이 아니라 Snowflake 기능이에요. Klaviyo의 내보내기 동기화는 표준 SQL을 사용해 KLAVIYO_PROFILE에 기록하며 특정 테이블 유형이 필요하지 않지만, 하이브리드 테이블은 Klaviyo에 문서화된 Snowflake 설정 스크립트에 포함되어 있지 않아요. 이 마이그레이션은 먼저 프로덕션이 아닌 데이터베이스에서 실행하고, Snowflake는 하이브리드 테이블 스토리지와 요청을 표준 테이블과 다르게 미터링한다는 점을 유의해 주세요.

시작하기 전에 알아야 할 것

다음 항목이 모두 필요해요:

  • 이미 구성되어 동기화 중인 Snowflake 대상입니다. Klaviyo의 데이터 웨어하우스 동기화 이해하기를 참고하세요.
  • KLAVIYO_PROFILE을 보관하는 스키마에서 CREATE TABLE 권한이 있는 역할(Klaviyo 설정 스크립트의 SYSADMIN)과, 권한을 부여할 수 있는 역할(SECURITYADMIN).
  • 하이브리드 테이블을 지원하는 계정이에요. 하이브리드 테이블은 일반적으로 상용 AWS 및 Microsoft Azure 리전에서만 사용할 수 있어요. Google Cloud, 미국 SnowGov 리전, 또는 평가판 계정에서는 사용할 수 없어요. Virtual Private Snowflake 고객은 Snowflake 지원팀에 문의해야 해요.
  • 데이터베이스당 Snowflake 2TB 하이브리드 스토리지 할당량의 여유 용량.

무엇이든 변경하기 전에 아래의 4가지 확인을 모두 진행해 주세요.

1. 계정에서 하이브리드 테이블을 지원하는지 확인해 주세요.

Snowflake 설정 스크립트에서 지정한 이름으로 KLAVIYO_DATABASE 및 KLAVIYO_DATA_TRANSFER_WAREHOUSE를 바꿔 주세요. 이 스크립트는 $profile_table 변수에서 프로필 테이블을 생성하므로, 이 문서에서 KLAVIYO_PROFILE을 언급하는 모든 부분에서 해당 변수에 할당한 값으로 바꿔 주세요.

text
USE ROLE SYSADMIN;
USE WAREHOUSE KLAVIYO_DATA_TRANSFER_WAREHOUSE;
USE DATABASE KLAVIYO_DATABASE;
USE SCHEMA PUBLIC;

CREATE OR REPLACE HYBRID TABLE HYBRID_SMOKE_TEST (ID VARCHAR(32) PRIMARY KEY);
DROP TABLE HYBRID_SMOKE_TEST;

둘 중 하나라도 실패하면 계정 또는 지역에서 하이브리드 테이블이 활성화되어 있지 않으므로 여기서 중단해 주세요.

2. 프로필 테이블 크기 조정

text
SELECT
    ROW_COUNT,
    BYTES / POWER(1024, 3) AS SIZE_GB
FROM KLAVIYO_DATABASE.INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'PUBLIC'
  AND TABLE_NAME = 'KLAVIYO_PROFILE';

하이브리드 테이블은 행 기반 기본 스토리지를 사용하므로, 동일한 데이터가 일반적으로 열 기반 표준 테이블보다 더 많은 공간을 차지해요. SIZE_GB 수치는 추정치가 아니라 최소치로 보고, 데이터베이스당 2 TB 할당량 아래에 여유 공간을 남겨 두세요.

3. 중복되거나 null인 ID 확인

Klaviyo의 설정 스크립트는 표준 테이블에 기본 키(ID)를 이미 선언하지만, Snowflake는 표준 테이블에서 기본 키를 강제 적용하지 않아요. 하이브리드 테이블은 기본 키를 강제 적용하므로, 이전에는 허용되던 중복 또는 null ID가 이제 로드를 차단하게 돼요. 두 쿼리 모두 0을 반환해야 해요.

text
SELECT COUNT(*) AS DUPLICATE_IDS
FROM (
    SELECT ID
    FROM KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE
    GROUP BY ID
    HAVING COUNT(*) > 1
);

SELECT COUNT(*) AS NULL_IDS
FROM KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE
WHERE ID IS NULL;

둘 중 하나라도 0이 아닌 값을 반환하면, 계속 진행하기 전에 표준 테이블에서 데이터 품질 문제를 해결해 주세요. 그렇지 않으면 2단계의 로드가 실패해요.

4. 다운스트림 종속성 확인

하이브리드 테이블은 클러스터링 키, 데이터 공유, 동적 테이블, Fail-safe, 구체화된 뷰, Query Acceleration Service, 복제, Search Optimization Service, Snowpipe, Snowpipe Streaming, 스트림, UNDROP을(를) 지원하지 않아요. Time Travel은 제한적으로 지원돼요.

text
SELECT
    REFERENCING_DATABASE,
    REFERENCING_SCHEMA,
    REFERENCING_OBJECT_NAME,
    REFERENCING_OBJECT_DOMAIN
FROM SNOWFLAKE.ACCOUNT_USAGE.OBJECT_DEPENDENCIES
WHERE REFERENCED_OBJECT_NAME = 'KLAVIYO_PROFILE';

다운스트림에서 지원되지 않는 기능에 의존하는 항목이 있다면, 마이그레이션하기 전에 다시 빌드해 주세요.

1단계: 내보내기 동기화를 일시 중지하세요

Klaviyo에서 Klaviyo 고급 데이터 플랫폼 > Data management > Syncing으로 이동한 다음 Snowflake 대상(대상지)을 클릭해 열고, Periodic 탭을 연 뒤 일시 중지를 선택해 주세요.

계속하기 전에 진행 중인 모든 동기화의 상태가 완료 또는 일시 중지로 표시될 때까지 기다려 주세요. 동기화가 테이블에 쓰는 동안 마이그레이션을 진행하면 행이 누락될 수 있어요.

2단계: 하이브리드 테이블을 만들고 로드하기

CREATE HYBRID TABLE ... AS SELECT에서는 전체 열 스키마를 명시적으로 선언해야 하며, SELECT에서 추론할 수 없어요. 기존 테이블과 동일한 열 이름과 데이터 유형을 사용해 Klaviyo의 동기화가 변경 없이 계속 쓰기 작업을 수행할 수 있도록 해 주세요.

text
USE ROLE SYSADMIN;
USE WAREHOUSE KLAVIYO_DATA_TRANSFER_WAREHOUSE;
USE DATABASE KLAVIYO_DATABASE;
USE SCHEMA PUBLIC;

CREATE OR REPLACE HYBRID TABLE KLAVIYO_PROFILE_HYBRID (
    ID VARCHAR(32) NOT NULL,
    EXTERNAL_ID VARCHAR(255),
    EMAIL VARCHAR(255),
    PHONE_NUMBER VARCHAR(255),
    FIRST_NAME VARCHAR(255),
    LAST_NAME VARCHAR(255),
    TITLE VARCHAR(255),
    ORGANIZATION VARCHAR(255),
    PROPERTIES OBJECT,
    IMAGE VARCHAR(255),
    CREATED TIMESTAMP_NTZ(9),
    UPDATED TIMESTAMP_NTZ(9),
    LOCATION_ADDRESS1 VARCHAR(255),
    LOCATION_ADDRESS2 VARCHAR(255),
    LOCATION_CITY VARCHAR(255),
    LOCATION_COUNTRY VARCHAR(255),
    LOCATION_LATITUDE VARCHAR(255),
    LOCATION_LONGITUDE VARCHAR(255),
    LOCATION_REGION VARCHAR(255),
    LOCATION_ZIP VARCHAR(255),
    PRIMARY KEY (ID)
)
AS
SELECT
    ID,
    EXTERNAL_ID,
    EMAIL,
    PHONE_NUMBER,
    FIRST_NAME,
    LAST_NAME,
    TITLE,
    ORGANIZATION,
    PROPERTIES,
    IMAGE,
    CREATED,
    UPDATED,
    LOCATION_ADDRESS1,
    LOCATION_ADDRESS2,
    LOCATION_CITY,
    LOCATION_COUNTRY,
    LOCATION_LATITUDE,
    LOCATION_LONGITUDE,
    LOCATION_REGION,
    LOCATION_ZIP
FROM KLAVIYO_PROFILE;
  • 세션에 실행 중인 웨어하우스가 설정되어 있어야 하며, 그렇지 않으면 CREATE HYBRID TABLE에서 오류가 발생해요.
  • PROPERTIES는 OBJECT 열로 유지됩니다. 인덱싱되지 않은 경우 하이브리드 테이블에서 반정형 열이 지원됩니다.
  • 빈 하이브리드 테이블에 CTAS를 실행하면 Snowflake의 최적화된 대량 로드 경로를 사용해요. Snowsight 쿼리 프로필에서는 빠른 경로를 사용할 때 삽입된 행 수(Number of rows inserted)가 대량 로드된 행 수(Number of rows bulk loaded)로 표시돼요.
  • 해당 문이 제약 조건에서 실패하면, 위의 검사에서 중복 ID 또는 null ID가 통과된 거예요. 표준 테이블에서 수정한 다음 다시 실행해 주세요.

매우 큰 테이블을 배치로 나누어 로드하기

단일 CTAS가 너무 커서 원활하게 실행하기 어렵다면, 하이브리드 테이블을 비워 둔 상태로 생성한 다음 날짜 범위로 나누어 로드해 주세요. INSERT INTO ... SELECT도 최적화된 대량 로드 경로를 사용해요.

text
CREATE OR REPLACE HYBRID TABLE KLAVIYO_PROFILE_HYBRID (
    ID VARCHAR(32) NOT NULL,
    EXTERNAL_ID VARCHAR(255),
    EMAIL VARCHAR(255),
    PHONE_NUMBER VARCHAR(255),
    FIRST_NAME VARCHAR(255),
    LAST_NAME VARCHAR(255),
    TITLE VARCHAR(255),
    ORGANIZATION VARCHAR(255),
    PROPERTIES OBJECT,
    IMAGE VARCHAR(255),
    CREATED TIMESTAMP_NTZ(9),
    UPDATED TIMESTAMP_NTZ(9),
    LOCATION_ADDRESS1 VARCHAR(255),
    LOCATION_ADDRESS2 VARCHAR(255),
    LOCATION_CITY VARCHAR(255),
    LOCATION_COUNTRY VARCHAR(255),
    LOCATION_LATITUDE VARCHAR(255),
    LOCATION_LONGITUDE VARCHAR(255),
    LOCATION_REGION VARCHAR(255),
    LOCATION_ZIP VARCHAR(255),
    PRIMARY KEY (ID)
);

INSERT INTO KLAVIYO_PROFILE_HYBRID
SELECT * FROM KLAVIYO_PROFILE
WHERE UPDATED < '2024-01-01';

INSERT INTO KLAVIYO_PROFILE_HYBRID
SELECT * FROM KLAVIYO_PROFILE
WHERE UPDATED >= '2024-01-01' AND UPDATED < '2025-01-01';

INSERT INTO KLAVIYO_PROFILE_HYBRID
SELECT * FROM KLAVIYO_PROFILE
WHERE UPDATED >= '2025-01-01' OR UPDATED IS NULL;

데이터에 맞게 경계를 조정하고, 범위가 서로 겹치거나 빈틈이 생기지 않도록 확인해 주세요.

3. 단계: 보조 인덱스 추가

ID의 기본 키는 자동으로 인덱싱돼요. 각 인덱스는 스토리지를 사용하고 모든 쓰기 작업에 비용을 추가하므로, 실제로 필터링하는 열에만 보조 인덱스를 추가해 주세요. EMAIL 또는 EXTERNAL_ID로 프로필을 조회한다면 해당 열을 인덱싱하세요. 또한 최신순으로 필터링하거나 정렬한다면(예: 특정 시간 이후에 업데이트된 프로필을 가져오는 경우) UPDATED도 인덱싱하세요.

text
CREATE INDEX IDX_KLAVIYO_PROFILE_EMAIL
    ON KLAVIYO_PROFILE_HYBRID (EMAIL);

CREATE INDEX IDX_KLAVIYO_PROFILE_EXTERNAL_ID
    ON KLAVIYO_PROFILE_HYBRID (EXTERNAL_ID);

CREATE INDEX IDX_KLAVIYO_PROFILE_UPDATED
    ON KLAVIYO_PROFILE_HYBRID (UPDATED);

EMAIL, PHONE_NUMBER 또는 EXTERNAL_ID에 UNIQUE 제약 조건을 추가하지 마세요. Klaviyo 프로필은 이러한 열 중 어떤 열에서도 null 또는 중복 값을 가질 수 있으며, 하이브리드 테이블은 UNIQUE 제약 조건을 적용하므로 동기화가 실패할 수 있어요.

  • PROPERTIES는 인덱싱할 수 없어요. 반정형 열(VARIANT, OBJECT, ARRAY)은 인덱싱할 수 없어요.
  • UPDATED 및 CREATED는 보조 인덱스에서 지원되는 TIMESTAMP_NTZ입니다. TIMESTAMP_TZ가 아닙니다.
  • 인덱스는 생성 후 변경하거나 열을 추가할 수 없어요. 인덱스를 변경하려면 삭제한 다음 다시 생성해 주세요.
  • 로드에서 "인덱스의 값이 너무 깁니다"가 반환되면 인덱싱된 열 수나 인덱싱된 열의 너비를 줄여 주세요.

테이블의 인덱스를 확인하려면:

text
SHOW INDEXES IN TABLE KLAVIYO_PROFILE_HYBRID;

4단계: 카피를 검증하세요

행 수가 일치해야 하며 차이 쿼리는 0을 반환해야 합니다.

text
SELECT
    (SELECT COUNT(*) FROM KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE) AS STANDARD_ROWS,
    (SELECT COUNT(*) FROM KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE_HYBRID) AS HYBRID_ROWS;

SELECT COUNT(*) AS MISSING_IDS
FROM (
    SELECT ID FROM KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE
    MINUS
    SELECT ID FROM KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE_HYBRID
);

새 테이블이 정말 하이브리드인지 확인한 다음, 표준 테이블에서 동일한 쿼리를 실행해 한 지점의 읽기 결과를 대조해 보세요:

text
SHOW HYBRID TABLES LIKE 'KLAVIYO_PROFILE_HYBRID';

SELECT * FROM KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE_HYBRID
WHERE EMAIL = 'someone@example.com';

5단계: 하이브리드 테이블을 제자리에 교체하기

롤백 경로를 확보할 수 있도록 표준 테이블은 삭제하지 말고, 방해되지 않게 이름을 변경해 주세요.

text
USE ROLE SYSADMIN;
USE DATABASE KLAVIYO_DATABASE;
USE SCHEMA PUBLIC;

ALTER TABLE KLAVIYO_PROFILE RENAME TO KLAVIYO_PROFILE_STANDARD_BACKUP;
ALTER TABLE KLAVIYO_PROFILE_HYBRID RENAME TO KLAVIYO_PROFILE;

권한은 테이블 이름이 아니라 테이블 객체를 따릅니다. 이름을 변경한 후에는 Klaviyo 서비스 역할에 새 KLAVIYO_PROFILE에 대한 권한이 없으므로, 6단계를 완료할 때까지 동기화가 실패해요.

6단계: Klaviyo 역할에 권한 다시 부여

Snowflake 설정 스크립트에서 role_name으로 설정한 역할 이름으로 바꿔 주세요.

text
USE ROLE SECURITYADMIN;

GRANT SELECT, INSERT, UPDATE, DELETE
    ON TABLE KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE
    TO ROLE KLAVIYO_DATA_TRANSFER_ROLE;

SHOW GRANTS ON TABLE KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE;

7단계: 동기화를 다시 시작하고 확인해 주세요.

Klaviyo에서 Klaviyo 고급 데이터 플랫폼 > Data management > Syncing으로 돌아간 다음 Snowflake 대상에서 클릭해 들어가 Periodic 탭을 열고 Resume을 선택해 주세요.

주기적 동기화는 매시간 실행돼요. 다음 주기가 완료되면 상태가 완료됨인지 확인하고 데이터가 수집되고 있는지 확인해 주세요:

text
SELECT
    COUNT(*) AS ROW_COUNT,
    MAX(UPDATED) AS LAST_UPDATED
FROM KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE;

동기화에 오류가 발생하면 Periodic 탭에서 실패한 내보내기를 열어 오류 요약, 코드, 그리고 Snowflake에서 반환된 메시지를 확인해 주세요. Klaviyo의 데이터 웨어하우스 동기화 이해하기의 ‘오류 로그 보기’ 섹션을 참고해 주세요.

롤백

하이브리드 테이블에서 동기화에 실패하고 되돌려야 하는 경우, 동기화를 일시 중지한 다음 테이블을 다시 바꿔 주세요.

text
USE ROLE SYSADMIN;
USE DATABASE KLAVIYO_DATABASE;
USE SCHEMA PUBLIC;

ALTER TABLE KLAVIYO_PROFILE RENAME TO KLAVIYO_PROFILE_HYBRID;
ALTER TABLE KLAVIYO_PROFILE_STANDARD_BACKUP RENAME TO KLAVIYO_PROFILE;

USE ROLE SECURITYADMIN;
GRANT SELECT, INSERT, UPDATE, DELETE
    ON TABLE KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE
    TO ROLE KLAVIYO_DATA_TRANSFER_ROLE;

그런 다음 동기화를 다시 시작해 주세요. Klaviyo의 다음 정기 동기화에서 테이블이 교체되어 있던 동안 생성되거나 업데이트된 모든 항목을 백필해요.

마이그레이션 후

새 테이블이 문제없다고 확신하면, 백업을 삭제해 저장소 비용이 더 이상 누적되지 않도록 해 주세요.

text
USE ROLE SYSADMIN;
DROP TABLE KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE_STANDARD_BACKUP;

마이그레이션 후에는 Klaviyo에서 데이터 웨어하우스 동기화 이해하기의 Snowflake 대상 설정 스크립트를 다시 실행하지 마세요. 해당 스크립트는 CREATE OR REPLACE TABLE을 사용하므로, 하이브리드 테이블이 빈 표준 테이블로 대체될 수 있어요.

다음 사항을 지속적으로 염두에 두세요:

  • 스토리지 할당량: Snowflake 데이터베이스당 하이브리드 테이블 데이터는 2 TB로 제한돼요. 할당량을 초과하면 사용량이 할당량 아래로 다시 내려갈 때까지 해당 데이터베이스의 모든 하이브리드 테이블에 대한 쓰기가 차단되며, 이로 인해 Klaviyo 동기화가 실패해요.
  • 할당량 요청: 읽기 80%/쓰기 20%로 균형 잡힌 워크로드의 경우, 데이터베이스당 초당 약 16,000회 작업이 발생해요.
  • 페일세이프 없음, 제한된 Time Travel: 하이브리드 테이블에서는 UNDROP가 지원되지 않아요. 필요하다면 자체 백업 프로세스를 유지해 주세요.
  • 결과 캐시 없음: 하이브리드 테이블에 대한 쿼리는 Snowflake의 영구 쿼리 결과 캐시를 사용하지 않아요.
  • 비용: 하이브리드 테이블 스토리지와 요청은 표준 테이블 스토리지 및 컴퓨팅과 별도로 미터링돼요. 대용량 테이블을 마이그레이션하기 전에 Snowflake의 비용 문서를 검토해 주세요.

추가 자료

이 도움말 문서가 유용했나요?
이 형식은 도움말 문서 피드백 용도로만 사용하세요. 지원 팀에 문의하는 방법.

Klaviyo에서 자세히 살펴보기

커뮤니티
동료, 파트너, Klaviyo 전문가와 연결되어 영감을 받고 인사이트를 공유하며, 모든 궁금한 사항에 대해 답을 얻으세요.
파트너
특정 작업을 도와주거나 지속적인 마케팅 관리를 위해 Klaviyo 인증 전문가를 고용하세요.
지원

계정을 통해 지원에 액세스하세요.

이메일 지원 (무료 체험 및 유료 계정) 연중무휴 24시간 사용 가능

채팅/가상 비서
사용 가능 여부는 위치 및 요금제 유형에 따라 다름