このページで学べること

SnowflakeでKlaviyoのデータウェアハウスエクスポートが書き込むKLAVIYO_PROFILEテーブルを、標準テーブルからSnowflakeのハイブリッドテーブルに変換する方法を、各手順で実行する正確なコマンドと併せてご紹介します。

Klaviyoのエクスポート同期は、定期実行のたびにMERGE(upsert)を使用してKLAVIYO_PROFILEに書き込みます。ハイブリッドテーブルは、低レイテンシでインデックスベースのポイント読み取りと書き込みを行うために構築されたSnowflakeのテーブルタイプです。そのため、変換することでこれらのMERGE操作の時間とコストを削減できます。これは、その後にどのようにテーブルを読み取るかに関係なく当てはまるため、下流で大規模な分析スキャンと集計のみを実行する場合でも実施する価値があります。KLAVIYO_PROFILEを使用して、アプリケーション、API、またはUIに対して個別のプロファイル検索を提供している場合、ハイブリッドテーブルはそれらの検索もより高速に返します。

アドバンストKDP は Klaviyo の標準マーケティングアプリケーションには含まれておらず、関連機能にアクセスするにはサブスクリプションが必要です。このプランの購入方法については、請求ガイドをご覧ください。

ハイブリッドテーブルは Snowflake の機能であり、Klaviyo の機能ではありません。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のデータベースあたり2 TBハイブリッドストレージクォータの残容量。

何かを変更する前に、以下の4つのチェックをすべて確認してください。

1. アカウントがハイブリッドテーブルに対応していることを確認する

KLAVIYO_DATABASE と KLAVIYO_DATA_TRANSFER_WAREHOUSE を、Snowflake の設定スクリプトで設定した名前に置き換えます。このスクリプトでは $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の数値は見積もりではなく下限として扱い、データベースあたりのクォータ2TBを下回る余裕を確保してください。

3. 重複または null の ID を確認する

Klaviyoのセットアップスクリプトでは標準テーブルに主キー(ID)がすでに宣言されていますが、Snowflakeでは標準テーブルの主キーが強制されません。ハイブリッドテーブルでは主キーが強制されるため、これまで許容されていた重複IDまたは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で[アドバンストKDP] > [データ管理] > [同期]と移動し、Snowflakeの宛先をクリックして、[定期]タブを開き、[一時停止]を選択します。

続行する前に、進行中の同期のステータスが Completed または Paused になっていることを確認してください。同期がテーブルに書き込み中に移行を行うと、行が失われる可能性があります。

手順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列のままになります。インデックス化されていない限り、ハイブリッドテーブルでは半構造化列がサポートされます。
  • 空のハイブリッドテーブルへのCTAでは、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にインデックスを設定することはできません。半構造化列(バリエーション、OBJECT、ARRAY)にはインデックスを設定できません。
  • UPDATEDとCREATEDはTIMESTAMP_NTZで、セカンダリインデックスでサポートされています。TIMESTAMP_TZはサポートされていません。
  • インデックスは、作成後に変更したり、列を追加したりできません。インデックスを変更するには、削除して再作成してください。
  • ロードで"The value is too long for index"が返される場合は、インデックス付き列の数、またはインデックス付き列の幅を減らしてください。

テーブル上のインデックスを確認するには:

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でアドバンストKDP > データ管理 > 同期に戻り、Snowflakeの宛先をクリックして開き、定期タブを開いて、[再開]を選択します。

定期的な同期は毎時実行されます。次のサイクルが完了したら、ステータスが Completed であることを確認し、データが取り込まれていることを確認してください:

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

同期でエラーが発生した場合は、[定期] タブで失敗したエクスポートを開き、エラーの概要、コード、および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データベースごとに、ハイブリッドテーブルデータは2TBまでに制限されます。超過すると、使用量がクォータ未満に戻るまで、そのデータベース内のすべてのハイブリッドテーブルへの書き込みがブロックされ、Klaviyoの同期は失敗します。
  • リクエストクォータ:読み取り 80%/書き込み 20%のバランスの取れたワークロードの場合、データベースあたり毎秒約 16,000 件の操作。
  • フェイルセーフなし、Time Travel は制限あり:ハイブリッドテーブルでは UNDROP はサポートされません。必要な場合は、独自のバックアッププロセスを維持してください。
  • 結果キャッシュなし:ハイブリッドテーブルに対するクエリでは、Snowflake の永続化されたクエリ結果キャッシュは使用されません。
  • コスト:ハイブリッドテーブルのストレージとリクエストは、標準のテーブルストレージとコンピューティングとは別に従量課金されます。大規模なテーブルを移行する前に、Snowflake のコストに関するドキュメントを確認してください。

その他のリソース

この記事は役に立ちましたか?
この記事へのフィードバックは、上記のボタン・記入欄よりご提供ください。 サポートへの連絡方法.

Klaviyo の詳細を見る

コミュニティ
同業者、パートナー、Klaviyo のエキスパートとつながり、インスピレーションを得たり、インサイトを共有したり、あらゆる質問への回答を得たりできます。
パートナー
特定のタスクや継続的なマーケティング管理のためのサポートを、Klaviyo 認定エキスパートに依頼しましょう。
サポート

アカウントからサポートにアクセスしてください。

メールサポート (無料トライアルと有料アカウント) 24 時間 365 日利用可能

チャット/バーチャル アシスタント
利用可否は地域およびプランタイプによって異なります