Migration deiner Snowflake-Profilexporttabelle zu einer Hybridtabelle
Übersicht
Erfahre, wie du die Tabelle KLAVIYO_PROFILE, in die der Data-Warehouse-Export von Klaviyo in Snowflake schreibt, mit den genauen Befehlen, die du in jedem Schritt ausführen musst, von einer Standardtabelle in eine Snowflake-Hybridtabelle konvertierst.
Klaviyos Export-Sync schreibt bei jedem regelmäßigen Durchlauf mit einem MERGE (Upsert) in KLAVIYO_PROFILE. Hybrid-Tabellen sind ein Snowflake-Tabellentyp, der für Point Reads und Writes mit geringer Latenz auf Indexbasis entwickelt wurde. Eine Konvertierung verkürzt daher die Dauer und senkt die Kosten dieser MERGE-Operationen – das gilt unabhängig davon, wie du die Tabelle anschließend liest. Deshalb lohnt es sich auch dann, wenn du nachgelagert nur große analytische Scans und Aggregationen ausführst. Wenn du KLAVIYO_PROFILE auch verwendest, um einer Anwendung, einer API oder einer UI individuelle Profilabfragen bereitzustellen, gibt eine Hybridtabelle diese Abfragen ebenfalls schneller zurück.
Advanced Klaviyo Data Platform ist nicht in der standardmäßigen Marketing-Anwendung von Klaviyo enthalten, und für den Zugriff auf die damit verbundenen Funktionen ist ein Abonnement erforderlich. Geh in unseren Abrechnungsleitfaden, um zu erfahren, wie du diesen Plan kaufen kannst.
Hybrid-Tabellen sind eine Snowflake-Funktion, keine Klaviyo-Funktion. Klaviyo's Export-Sync schreibt mit Standard-SQL in KLAVIYO_PROFILE und erfordert keinen bestimmten Tabellentyp, aber Hybrid-Tabellen sind nicht Teil von Klaviyo's dokumentiertem Snowflake-Setup-Skript. Führe diese Migration zuerst in einer Nicht-Produktionsdatenbank aus, und beachte, dass Snowflake Hybrid-Tabellen-Speicher und -Anfragen anders als Standardtabellen misst.
Bevor du anfängst
Du benötigst Folgendes:
- Ein Snowflake-Ziel, das bereits konfiguriert ist und synchronisiert wird. Siehe Grundlegendes zur Data-Warehouse-Synchronisierung in Klaviyo.
- Eine Rolle mit CREATE TABLE für das Schema, das KLAVIYO_PROFILE enthält (SYSADMIN im Setup-Skript von Klaviyo), und eine Rolle, die Berechtigungen vergeben kann (SECURITYADMIN).
- Ein Konto, das Hybrid-Tabellen unterstützt. Hybrid-Tabellen sind im Allgemeinen nur in kommerziellen AWS- und Microsoft-Azure-Regionen allgemein verfügbar. Sie sind nicht in Google Cloud, in US-amerikanischen SnowGov-Regionen oder in Testkonten verfügbar. Kund*innen von Virtual Private Snowflake müssen den Snowflake-Support kontaktieren.
- Spielraum unter Snowflakes 2-TB-Hybridspeicherlimit pro Datenbank.
Arbeite alle vier Prüfungen unten durch, bevor du etwas änderst.
1. Bestätige, dass dein Konto Hybrid-Tabellen unterstützt
Ersetze KLAVIYO_DATABASE und KLAVIYO_DATA_TRANSFER_WAREHOUSE durch die Namen, die du in deinem Snowflake-Einrichtungsskript festgelegt hast. Das Skript erstellt die Profiltabelle aus einer Variable $profile_table. Ersetze daher überall dort, wo dieser Artikel auf KLAVIYO_PROFILE verweist, den Wert durch den Wert, den du dort zugewiesen hast.
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; Wenn eine der beiden Aussagen fehlschlägt, sind Hybridtabellen für dein Konto oder deine Region nicht aktiviert und du solltest hier stoppen.
2. Dimensioniere deine Profiltabelle
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'; Hybrid-Tabellen verwenden eine zeilenbasierte primäre Speicherung, daher belegen dieselben Daten in der Regel mehr Speicherplatz als in einer spaltenbasierten Standardtabelle. Betrachte den SIZE_GB-Wert als Untergrenze, nicht als Schätzung, und lass unterhalb des Datenbankkontingents von 2 TB pro Datenbank genug Spielraum.
3. Auf doppelte oder Null-IDs prüfen
Das Setup-Skript von Klaviyo deklariert bereits den Primärschlüssel (ID) in der Standardtabelle, aber Snowflake erzwingt keine Primärschlüssel in Standardtabellen. Hybride Tabellen erzwingen sie jedoch, sodass doppelte oder NULL-IDs, die zuvor toleriert wurden, jetzt den Ladevorgang blockieren. Beide Abfragen müssen 0 zurückgeben.
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; Wenn einer der beiden einen Wert ungleich Null zurückgibt, behebe das Datenqualitätsproblem in der Standardtabelle, bevor du fortfährst. Andernfalls schlägt der Ladevorgang in Schritt 2 fehl.
4. Auf nachgelagerte Abhängigkeiten prüfen
Hybrid-Tabellen unterstützen keine Clustering-Schlüssel, Datenfreigabe, dynamischen Tabellen, Fail-safe, materialisierten Ansichten, Query Acceleration Service, Replikation, Search Optimization Service, Snowpipe, Snowpipe Streaming, Streams oder UNDROP. Time Travel wird mit Einschränkungen unterstützt.
SELECT
REFERENCING_DATABASE,
REFERENCING_SCHEMA,
REFERENCING_OBJECT_NAME,
REFERENCING_OBJECT_DOMAIN
FROM SNOWFLAKE.ACCOUNT_USAGE.OBJECT_DEPENDENCIES
WHERE REFERENCED_OBJECT_NAME = 'KLAVIYO_PROFILE'; Wenn irgendetwas nachgelagert von einer nicht unterstützten Funktion abhängt, erstelle es neu, bevor du migrierst.
Schritt 1: Pausiere deine Export-Synchronisierung
Navigiere in Klaviyo zu Advanced Klaviyo Data Platform > Datenmanagement > Synchronisierung, klicke in dein Snowflake-Ziel, öffne den Tab Periodisch und wähle Pausieren.
Warte, bis jede laufende Synchronisierung den Status „Abgeschlossen“ oder „Pausiert“ anzeigt, bevor du fortfährst. Wenn du migrierst, während eine Synchronisierung in die Tabelle schreibt, können Zeilen verloren gehen.
Schritt 2: Erstelle die Hybridtabelle und lade sie
CREATE HYBRID TABLE ... AS SELECT erfordert, dass du das vollständige Spaltenschema explizit deklarierst; es kann nicht aus dem SELECT abgeleitet werden. Verwende dieselben Spaltennamen und Datentypen wie in der bestehenden Tabelle, damit Klaviyos Synchronisierung weiterhin ohne Änderungen in diese schreibt.
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; - In deiner Sitzung muss ein aktives Warehouse festgelegt sein, sonst gibt CREATE HYBRID TABLE einen Fehler zurück.
- PROPERTIES bleibt eine OBJECT-Spalte. Semistrukturierte Spalten werden in hybriden Tabellen unterstützt, solange sie nicht indexiert sind.
- Das Einfügen von CTAS in eine leere Hybridtabelle verwendet den optimierten Bulk-Load-Pfad von Snowflake. Im Snowsight-Abfrageprofil wird „Number of rows inserted“ als „Number of rows bulk loaded“ angezeigt, wenn der schnelle Pfad verwendet wird.
- Wenn die Anweisung an einer Einschränkung scheitert, ist eine doppelte oder NULL-ID durch die obige Prüfung gerutscht. Behebe es in der Standardtabelle und führe es erneut aus.
Eine sehr große Tabelle in Batches laden
Wenn eine einzelne CTAS zu groß ist, um sie problemlos auszuführen, erstelle die Hybrid-Tabelle leer und lade sie stattdessen in Datumsbereichen. INSERT INTO ... SELECT verwendet ebenfalls den optimierten Bulk-Load-Pfad.
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; Passe die Grenzen an deine Daten an und stelle sicher, dass sich die Bereiche weder überschneiden noch Lücken lassen.
Schritt 3: Sekundäre Indizes hinzufügen
Der Primärschlüssel für ID wird automatisch indiziert. Füge sekundäre Indizes nur für die Spalten hinzu, nach denen du tatsächlich filterst, da jeder Index Speicher verbraucht und die Kosten für jeden Schreibvorgang erhöht. Wenn du Profile nach EMAIL oder EXTERNAL_ID nachschlägst, indiziere diese Spalten; wenn du außerdem nach Aktualität filterst oder sortierst (z. B. indem du Profile abrufst, die seit einem bestimmten Zeitpunkt aktualisiert wurden), indiziere UPDATED ebenfalls.
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); Füge EMAIL, PHONE_NUMBER oder EXTERNAL_ID keine UNIQUE-Constraints hinzu. Klaviyo-Profile können in jeder dieser Spalten einen Nullwert oder einen wiederholten Wert haben, und Hybridtabellen erzwingen UNIQUE-Constraints, wodurch deine Synchronisierung fehlschlagen würde.
- Du kannst PROPERTIES nicht indizieren. Semistrukturierte Spalten (VARIANTE, OBJECT, ARRAY) können nicht indiziert werden.
- UPDATED und CREATED sind TIMESTAMP_NTZ, was für sekundäre Indizes unterstützt wird. TIMESTAMP_TZ ist es nicht.
- Indizes können nach der Erstellung nicht geändert werden, und es können keine Spalten hinzugefügt werden. Lösche den Index und erstelle ihn neu, um ihn zu ändern.
- Wenn ein Ladevorgang „The value is too long for index“ zurückgibt, reduziere die Anzahl der indizierten Spalten oder die Breite der indizierten Spalten.
So siehst du die Indizes in der Tabelle:
SHOW INDEXES IN TABLE KLAVIYO_PROFILE_HYBRID; Schritt 4: Text überprüfen
Die Zeilenanzahlen müssen übereinstimmen, und die Differenzabfrage muss 0 zurückgeben.
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
); Bestätige, dass die neue Tabelle wirklich hybrid ist, und prüfe dann stichprobenartig einen gelesenen Datenpunkt anhand derselben Abfrage in der Standardtabelle:
SHOW HYBRID TABLES LIKE 'KLAVIYO_PROFILE_HYBRID';
SELECT * FROM KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE_HYBRID
WHERE EMAIL = 'someone@example.com'; Schritt 5: Hybrid-Tabelle austauschen
Benenne die Standardtabelle um und räume sie aus dem Weg, statt sie zu löschen, damit du einen Rollback-Pfad hast.
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; Berechtigungen folgen dem Tabellenobjekt, nicht dem Tabellennamen. Nach dem Umbenennen hat deine Klaviyo-Service-Rolle keine Berechtigungen für das neue KLAVIYO_PROFILE, und die Synchronisierung schlägt fehl, bis du Schritt 6 abgeschlossen hast.
Schritt 6: Berechtigungen erneut an die Klaviyo-Rolle vergeben
Ersetze den Rollennamen, den du in deinem Snowflake-Einrichtungsskript als role_name festgelegt hast.
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; Schritt 7: Setze die Synchronisierung fort und bestätige sie
Gehe in Klaviyo zurück zu Advanced Klaviyo Data Platform > Datenverwaltung > Synchronisierung, klicke auf dein Snowflake-Ziel, öffne den Tab Periodisch und wähle Fortsetzen.
Regelmäßige Synchronisierungen werden stündlich ausgeführt. Nachdem der nächste Zyklus abgeschlossen ist, bestätige, dass der Status Abgeschlossen ist, und überprüfe, dass Daten ankommen:
SELECT
COUNT(*) AS ROW_COUNT,
MAX(UPDATED) AS LAST_UPDATED
FROM KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE; Wenn bei der Synchronisierung Fehler auftreten, öffne im Tab „Periodisch“ den fehlgeschlagenen Export, um die Fehlerzusammenfassung, den Code und die von Snowflake zurückgegebene Nachricht zu lesen. Sieh dir den Abschnitt „Fehlerprotokolle anzeigen“ in Grundlegendes zur Data-Warehouse-Synchronisierung in Klaviyo an.
Zurücksetzen
Wenn die Synchronisierung mit der Hybridtabelle fehlschlägt und du zurücksetzen musst, pausiere die Synchronisierung und tausche die Tabellen wieder zurück.
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; Setze dann die Synchronisierung fort. Klaviyos nächste regelmäßige Synchronisierung füllt alles nach, was erstellt oder aktualisiert wurde, während die Tabelle ausgetauscht wurde.
Nach der Migration
Sobald du dir bei der neuen Tabelle sicher bist, lösche das Backup, damit keine Speicherkosten mehr anfallen.
USE ROLE SYSADMIN;
DROP TABLE KLAVIYO_DATABASE.PUBLIC.KLAVIYO_PROFILE_STANDARD_BACKUP; Führe das Snowflake-Ziel-Setup-Skript aus Data Warehouse-Synchronisierung in Klaviyo verstehen nach der Migration nicht erneut aus. Dieses Skript verwendet CREATE OR REPLACE TABLE, wodurch deine Hybrid-Tabelle durch eine leere Standardtabelle ersetzt würde.
Behalte Folgendes fortlaufend im Hinterkopf:
- Speicherkontingent: Du bist auf 2 TB Hybrid-Tabellen-Daten pro Snowflake-Datenbank beschränkt. Wenn du das Limit überschreitest, werden Schreibvorgänge in jede Hybrid-Tabelle in dieser Datenbank blockiert, bis du die Nutzung wieder unter die Quote bringst, wodurch deine Klaviyo-Synchronisierung fehlschlägt.
- Kontingent anfordern: Etwa 16.000 Vorgänge pro Sekunde und Datenbank für eine ausgewogene Arbeitslast von 80 % Lesen / 20 % Schreiben.
- Kein Fail-safe, begrenzte Zeitreise: UNDROP wird für Hybrid-Tabellen nicht unterstützt. Wenn du eine brauchst, sorge selbst für einen Backup-Prozess.
- Kein Ergebnis-Cache: Abfragen für hybride Tabellen verwenden nicht den Cache für persistierte Abfrageergebnisse von Snowflake.
- Kosten: Hybrider Tabellenspeicher und Anfragen werden separat vom Standard-Tabellenspeicher und der Compute-Leistung gemessen. Sieh dir Snowflakes Kostendokumentation an, bevor du eine große Tabelle migrierst.
Weitere Ressourcen
- Grundlegendes zur Data-Warehouse-Synchronisierung in Klaviyo
- Klaviyo und Snowflake verbinden
- Snowflake: Hybride Tabellen
- Snowflake: Hybrid-Tabellen erstellen
- Schneeflocke: Einschränkungen und nicht unterstützte Funktionen für hybride Tabellen
- Snowflake: Kosten für hybride Tabellen bewerten
- Snowflake: Konvertieren von standardmäßigen Snowflake-Tabellen in hybride Tabellen