Erste Schritte mit hybriden Tabellen

Einführung

Eine Hybridtabelle ist ein Snowflake-Tabellentyp, der für hybride transaktionale und analytische Workloads optimiert ist. Diese Workloads erfordern niedrige Latenzzeiten und einen hohen Durchsatz bei kleinen, aber zufälligen Lese- und Schreibvorgängen, die oft auf eine einzelne Zeile in einer Tabelle zugreifen. Hybridtabellen setzen eindeutige und referenzielle Integritätseinschränkungen durch, die für transaktionale Workloads entscheidend sind.

Sie können eine Hybridtabelle zusammen mit anderen Snowflake-Tabellen und -Features verwenden, um Unistore-Workloads zu unterstützen, die Transaktions- und Analysedaten in einer einzigen Plattform vereinen.

Hybridtabellen werden nahtlos in die bestehende Snowflake-Architektur integriert. Die Kunden verbinden sich mit demselben Snowflake-Datenbankdienst. Abfragen werden in der Clouddiensteschicht kompiliert und optimiert und über dieselbe Abfrage-Engine der virtuellen Warehouses ausgeführt. Diese Architektur bietet mehrere entscheidende Vorteile:

  • Die Features der Snowflake-Plattform, wie z. B. Data Governance, können sofort mit Hybridtabellen genutzt werden.

  • Sie können hybride Workloads ausführen, die operative und analytische Abfragen mischen.

  • Sie können Hybridtabellen mit anderen Snowflake-Tabellen verknüpfen und die Abfrage wird nativ und effizient in derselben Abfrage-Engine ausgeführt. Es ist keine Authentifizierung erforderlich.

  • Sie können eine atomare Transaktion über Hybridtabellen und andere Snowflake-Tabellen ausführen. Es besteht keine Notwendigkeit, ein eigenes zweistufiges Commit zu organisieren.

Unistore-Architektur

Hybridtabellen nutzen einen Zeilenspeicher als primären Datenspeicher, um eine hervorragende Leistung bei operativen Abfragen zu erzielen. Wenn Sie in eine Hybridtabelle schreiben, werden die Daten direkt in den Zeilenspeicher geschrieben. Die Daten werden asynchron in den Objektspeicher kopiert, um eine bessere Leistung und Workload-Isolation für große Scans sicherzustellen, ohne die laufenden operativen Workloads zu beeinträchtigen. Einige Daten können auch im Spaltenformat in Ihrem Warehouse zwischengespeichert werden, um eine bessere Leistung bei analytischen Abfragen zu erzielen. Sie führen einfach SQL-Anweisungen auf der logischen Hybridtabelle aus, und die Abfrageoptimierung entscheidet, von wo die Daten gelesen werden sollen, um die beste Leistung zu erzielen. Sie erhalten eine einheitliche Sicht auf Ihre Daten, ohne sich um die zugrunde liegende Infrastruktur kümmern zu müssen.

Lerninhalte

In diesem Tutorial lernen Sie Folgendes:

  • Erstellen und Laden von Hybridtabellen in einem Schritten.

  • Erstellen und Überprüfen der Durchsetzung der UNIQUE-, PRIMARY KEY- und FOREIGN KEY-Einschränkungen.

  • Ausführen paralleler Aktualisierungen, die von Sperren auf Zeilenebene abhängig sind.

  • Ausführen einer Operation mit mehreren Anweisungen in einer konsistenten atomaren Transaktion (über Hybrid- und Standardtabellen hinweg).

  • Abfragen von Hybridtabellen und Verknüpfen von Hybridtabellen mit Standardtabellen.

  • Sicherstellen, dass die Sicherheits- und Governance-Prinzipien sowohl für Hybrid- als auch für Standardtabellen gelten.

Voraussetzungen

Dieses Tutorial setzt voraus, dass Sie:

Schritt 1: Konto einrichten

Als ersten Schritt richten Sie Ihr Snowflake Konto ein, indem Sie ein neues Arbeitsblatt, eine Rolle, Datenbankobjekte und ein virtuelles Warehouse erstellen. Dann können Sie zwei Hybridtabellen und eine Standardtabelle erstellen. Führen Sie die folgenden Schritte aus:

  1. Klicken Sie unter Worksheets auf die Schaltfläche + oben rechts in der Snowsight und wählen Sie SQL Worksheet aus.

  2. Benennen Sie das Arbeitsblatt um, indem Sie seinen automatisch generierten Zeitstempelnamen auswählen und Hybrid Tables - QuickStart eingeben.

  3. Führen Sie die folgenden Schritte aus, indem Sie den Block mit den SQL-Befehlen in Ihr Arbeitsblatt kopieren und alle Befehle ausführen.

    1. Verwenden Sie die Rolle ACCOUNTADMIN, um die kundenspezifische Rolle hybrid_quickstart_role zu erstellen, und weisen Sie diese Rolle dann dem aktuellen Benutzer zu.

    2. Erstellen Sie das Warehouse hybrid_quickstart_wh und die Datenbank hybrid_quickstart_db. Erteilen Sie der neuen Rolle die Eigentümerschaft an diesen Objekten.

    3. Verwenden Sie die neue Rolle, um das Schema data zu erstellen.

    4. Verwenden Sie das neue Warehouse. (Die Datenbank und das Schema, die Sie erstellt haben, werden standardmäßig bereits verwendet)

    USE ROLE ACCOUNTADMIN;
    CREATE OR REPLACE ROLE hybrid_quickstart_role;
    SET my_user = CURRENT_USER();
    GRANT ROLE hybrid_quickstart_role TO USER IDENTIFIER($my_user);
    
    CREATE OR REPLACE WAREHOUSE hybrid_quickstart_wh WAREHOUSE_SIZE = XSMALL, AUTO_SUSPEND = 300, AUTO_RESUME = TRUE;
    GRANT OWNERSHIP ON WAREHOUSE hybrid_quickstart_wh TO ROLE hybrid_quickstart_role;
    CREATE OR REPLACE DATABASE hybrid_quickstart_db;
    GRANT OWNERSHIP ON DATABASE hybrid_quickstart_db TO ROLE hybrid_quickstart_role;
    
    USE ROLE hybrid_quickstart_role;
    CREATE OR REPLACE SCHEMA data;
    
    USE WAREHOUSE hybrid_quickstart_wh;
    
    Copy

Schritt 2: Drei Tabellen erstellen und laden

In diesem Tutorial wird das fiktive Food-Truck-Geschäft „Tasty Bytes Snowflake“ verwendet, um einen Anwendungsfall zu simulieren, bei dem Sie Daten an eine Anwendung senden können.

Sie werden drei Tabellen erstellen:

  • Die Hybridtabelle order_header – Diese Tabelle speichert Metadaten zu Bestellungen wie truck_id, customer_id, order_amount und so weiter.

  • Die Hybridtabelle truck – Diese Tabelle speichert Truck-Metadaten wie truck_id, franchise_id, menu_type_id und so weiter.

  • Die Standardtabelle truck_history – Diese Tabelle speichert historische Informationen über Food Trucks, sodass Sie Veränderungen im Laufe der Zeit verfolgen können.

Sie erstellen Hybrid- und Standardtabellen, um zu zeigen, wie gut sie zusammen funktionieren. Nichtsdestotrotz weisen Hybridtabellen einige grundlegende Unterschiede in ihrer Definition und Verhaltensweise auf:

  • Hybridtabellen erfordern einen Primärschlüssel für eine oder mehrere Spalten (was die Erstellung eines Index für den Primärschlüssel voraussetzt).

  • Hybridtabellen ermöglichen die Erstellung von sekundären Indizes auf jeder Spalte.

  • PRIMARY KEY-, FOREIGN KEY-, und UNIQUE-Einschränkungen werden alle auf Hybridtabellen angewendet.

  • Sperren für Hybridtabellen gelten auf Zeilenebene, nicht auf Tabellenebene.

  • Die Daten von Hybridtabellen befinden sich in einem Zeilenspeicher, werden aber auch in einen spaltenbasierten Objektspeicher kopiert.

Aus diesen Unterschieden ergeben sich:

  • Unterstützung der referenziellen Integrität beim Laden, Aktualisieren oder Löschen von Tabellendaten.

  • Schnellere DML-Operationen (insbesondere solche, die einzelne Zeilen aktualisieren).

  • Schnellere Suchabfragen.

Sie können Daten in großen Mengen in Hybridtabellen laden, indem Sie Daten aus einem Stagingbereich oder aus anderen Tabellen kopieren (d. h. mit CTAS, COPY INTO <Tabelle>, oder INSERT INTO … SELECT). Es wird dringend empfohlen, Daten in großen Mengen mit einer CTAS-Anweisung in eine Hybridtabelle zu laden, da bestimmte Optimierungen ausschließlich während des Ladevorgangs bei der Tabellenerstellung möglich sind.

Erstellen Sie ein Dateiformat, das ein Staging-Datenset beschreibt, auf das Sie zugreifen oder das Sie in Snowflake-Tabellen laden können, und einen Staginbereich, der ein Snowflake-Objekt ist und auf einen Speicherort in der Cloud verweist, auf den Snowflake zugreifen kann, um Daten sowohl einzulesen als auch abzufragen. Die Daten werden in einem öffentlich zugänglichen AWS-S3-Bucket gespeichert, auf den Sie bei der Erstellung des Stagingbereichs verweisen.

CREATE OR REPLACE FILE FORMAT csv_format TYPE = CSV FIELD_DELIMITER = ',' SKIP_HEADER = 1 NULL_IF = ('NULL', 'null') EMPTY_FIELD_AS_NULL = true;
CREATE OR REPLACE STAGE frostbyte_tasty_bytes_stage URL = 's3://sfquickstarts/hybrid_table_guide' FILE_FORMAT = csv_format;
Copy

Verwenden Sie nun die Anweisung LIST, um alle Dateien im Verzeichnis FROSTBYTE_TASTY_BYTES_STAGE zurückzugeben:

LIST @frostbyte_tasty_bytes_stage;
Copy

Die Anweisung sollte zwei Datensätze zurückgeben: einen für die Datei TRUCK.csv und einen für die Datei ORDER_HEADER.csv.

Ausgabe des LIST-Befehls mit den Namen und Größen der beiden Dateien.

Nachdem Sie den Stagingbereich erstellt haben, der auf den Speicherort der Daten in der Cloud verweist, können Sie die Daten mit dem Befehl CTAS erstellen und in den truck laden, der Daten aus der Datei TRUCK.csv auswählt. Beachten Sie die PRIMARY KEY-Einschränkung in der Spalte truck_id.

Die zweite DDL-Anweisung erstellt eine Standardtabelle mit dem Namen truck_history, ebenfalls unter Verwendung einer CTAS-Anweisung

SET CURRENT_TIMESTAMP = CURRENT_TIMESTAMP();

CREATE OR REPLACE HYBRID TABLE truck (
  truck_id NUMBER(38,0) NOT NULL,
  menu_type_id NUMBER(38,0),
  primary_city VARCHAR(16777216),
  region VARCHAR(16777216),
  iso_region VARCHAR(16777216),
  country VARCHAR(16777216),
  iso_country_code VARCHAR(16777216),
  franchise_flag NUMBER(38,0),
  year NUMBER(38,0),
  make VARCHAR(16777216),
  model VARCHAR(16777216),
  ev_flag NUMBER(38,0),
  franchise_id NUMBER(38,0),
  truck_opening_date DATE,
  truck_email VARCHAR NOT NULL UNIQUE,
  record_start_time TIMESTAMP,
  PRIMARY KEY (truck_id)
  )
  AS
  SELECT
      t.$1 AS truck_id,
      t.$2 AS menu_type_id,
      t.$3 AS primary_city,
      t.$4 AS region,
      t.$5 AS iso_region,
      t.$6 AS country,
      t.$7 AS iso_country_code,
      t.$8 AS franchise_flag,
      t.$9 AS year,
      t.$10 AS make,
      t.$11 AS model,
      t.$12 AS ev_flag,
      t.$13 AS franchise_id,
      t.$14 AS truck_opening_date,
      CONCAT(truck_id, '_truck@email.com') truck_email,
      $CURRENT_TIMESTAMP AS record_start_time
    FROM @FROSTBYTE_TASTY_BYTES_STAGE (PATTERN=>'.*TRUCK.csv') t;

CREATE OR REPLACE TABLE truck_history (
  truck_id NUMBER(38,0) NOT NULL,
  menu_type_id NUMBER(38,0),
  primary_city VARCHAR(16777216),
  region VARCHAR(16777216),
  iso_region VARCHAR(16777216),
  country VARCHAR(16777216),
  iso_country_code VARCHAR(16777216),
  franchise_flag NUMBER(38,0),
  year NUMBER(38,0),
  make VARCHAR(16777216),
  model VARCHAR(16777216),
  ev_flag NUMBER(38,0),
  franchise_id NUMBER(38,0),
  truck_opening_date DATE,
  truck_email VARCHAR NOT NULL UNIQUE,
  record_start_time TIMESTAMP,
  record_end_time TIMESTAMP,
  PRIMARY KEY (truck_id)
  )
  AS
  SELECT
      t.$1 AS truck_id,
      t.$2 AS menu_type_id,
      t.$3 AS primary_city,
      t.$4 AS region,
      t.$5 AS iso_region,
      t.$6 AS country,
      t.$7 AS iso_country_code,
      t.$8 AS franchise_flag,
      t.$9 AS year,
      t.$10 AS make,
      t.$11 AS model,
      t.$12 AS ev_flag,
      t.$13 AS franchise_id,
      t.$14 AS truck_opening_date,
      CONCAT(truck_id, '_truck@email.com') truck_email,
      $CURRENT_TIMESTAMP AS record_start_time,
      NULL AS record_end_time
   FROM @frostbyte_tasty_bytes_stage (PATTERN=>'.*TRUCK.csv') t;
Copy

Die folgende DDL-Anweisung erstellt die Struktur für die Hybridtabelle order_header. Beachten Sie die PRIMARY KEY-Einschränkung für die Spalte order_id, die FOREIGN KEY-Einschränkung für die Spalte truck_id aus der Tabelle truck und den sekundären Index für die Spalte order_ts.

CREATE OR REPLACE HYBRID TABLE order_header (
  order_id NUMBER(38,0) NOT NULL,
  truck_id NUMBER(38,0),
  location_id NUMBER(19,0),
  customer_id NUMBER(38,0),
  discount_id FLOAT,
  shift_id NUMBER(38,0),
  shift_start_time TIME(9),
  shift_end_time TIME(9),
  order_channel VARCHAR(16777216),
  order_ts TIMESTAMP_NTZ(9),
  served_ts VARCHAR(16777216),
  order_currency VARCHAR(3),
  order_amount NUMBER(38,4),
  order_tax_amount VARCHAR(16777216),
  order_discount_amount VARCHAR(16777216),
  order_total NUMBER(38,4),
  order_status VARCHAR(16777216) DEFAULT 'INQUEUE',
  PRIMARY KEY (order_id),
  FOREIGN KEY (truck_id) REFERENCES TRUCK(truck_id),
  INDEX IDX01_ORDER_TS(order_ts)
);
Copy

Die folgende DML-Anweisung fügt Daten in die Tabelle order_header ein, wobei eine Anweisung INSERT INTO … SELECT verwendet wird.

INSERT INTO order_header (
  order_id,
  truck_id,
  location_id,
  customer_id,
  discount_id,
  shift_id,
  shift_start_time,
  shift_end_time,
  order_channel,
  order_ts,
  served_ts,
  order_currency,
  order_amount,
  order_tax_amount,
  order_discount_amount,
  order_total,
  order_status)
  SELECT
      t.$1 AS order_id,
      t.$2 AS truck_id,
      t.$3 AS location_id,
      t.$4 AS customer_id,
      t.$5 AS discount_id,
      t.$6 AS shift_id,
      t.$7 AS shift_start_time,
      t.$8 AS shift_end_time,
      t.$9 AS order_channel,
      t.$10 AS order_ts,
      t.$11 AS served_ts,
      t.$12 AS order_currency,
      t.$13 AS order_amount,
      t.$14 AS order_tax_amount,
      t.$15 AS order_discount_amount,
      t.$16 AS order_total,
      '' as order_status
    FROM @frostbyte_tasty_bytes_stage (PATTERN=>'.*ORDER_HEADER.csv') t;
Copy

Schritt 3: Daten untersuchen

Sie haben bereits die Rolle hybrid_quickstart_role, das Warehouse hybrid_quickstart_wh, die Datenbank hybrid_quickstart_db und das Schema data erstellt. Verwenden Sie diese Objekte weiterhin.

Sie haben auch die Tabellen truck, truck_history und order_header erstellt und geladen. Jetzt können Sie einige Abfragen ausführen und sich sowohl mit den Daten in diesen Tabellen als auch mit ihren Metadaten vertraut machen.

Verwenden Sie den Befehl SHOW TABLES, um Eigenschaften und Metadaten sowohl für Standard- als auch für Hybridtabellen anzuzeigen. Verwenden Sie den Befehl SHOW HYBRID TABLES, um nur Informationen über Hybridtabellen anzuzeigen.

SHOW TABLES LIKE '%truck%';
Copy
Ausgabe des Befehls SHOW TABLES für die Tabelle „Truck“
SHOW HYBRID TABLES LIKE '%order_header%';
Copy
Ausgabe des Befehls SHOW HYBRID TABLES für die Tabelle order_header

Zeigen Sie mit den Befehlen DESCRIBE <Objekt> Informationen über die Spalten der Tabelle an. Beachten Sie die Spalten mit den PRIMARY KEY- und UNIQUE-Einschränkungen.

DESCRIBE TABLE truck;
Copy
Ausgabe des Befehls DESCRIBE für die Tabelle „Truck“
DESCRIBE TABLE order_header;
Copy
Ausgabe des Befehls DESCRIBE für die Tabelle order_header

Listet die Hybridtabellen auf, für die Sie Zugriffsrechte haben.

SHOW HYBRID TABLES;
Copy
Ausgabe des Befehls SHOW HYBRID TABLES

Listet alle Indizes auf, für die Sie Zugriffsrechte haben. Beachten Sie den Wert in der Spalte is_unique für jeden Index.

SHOW INDEXES;
Copy
Ausgabe des Befehls SHOW INDEXES

Sehen Sie sich Beispieldaten aus den Tabellen an, indem Sie diese einfachen Abfragen ausführen.

SELECT * FROM truck LIMIT 10;
SELECT * FROM truck_history LIMIT 10;
SELECT * FROM order_header LIMIT 10;
Copy

Die Ausgabe für die erste Abfrage sieht in etwa wie folgt aus:

Ausgabe der SELECT-Abfrage über die Tabelle „Truck“

Schritt 4: Verhaltensweise der von UNIQUE- und FOREIGN KEY-Einschränkungen testen

In diesem Schritt werden Sie die UNIQUE- und FOREIGN KEY-Einschränkungen testen. Diese Einschränkungen werden durchgesetzt, wenn sie für Hybridtabellen definiert sind.

UNIQUE-Einschränkungen bewahren die Datenintegrität, indem sie verhindern, dass doppelte Werte in eine Spalte eingefügt werden. FOREIGN KEY-Einschränkungen arbeiten mit PRIMARY KEY-Einschränkungen zusammen, um die referenzielle Integrität zu wahren. Ein Wert kann nicht in eine Primärschlüsselspalte eingefügt werden, wenn kein passender Fremdschlüsselwert in der referenzierten Tabelle existiert. So kann zum Beispiel der Verkauf eines Produkts mit ID 100 nicht in einer Verkaufstabelle erfasst werden, wenn eine solche Produkt-ID nicht bereits in einer referenzierten Produktdimensionstabelle vorhanden ist.

Beide Arten von Einschränkungen unterstützen die Datengenauigkeit und -konsistenz bei Anwendungen, die in hohem Maße auf eine zuverlässige, aber schnelle Verarbeitung von Transaktionen angewiesen sind.

Schritt 4.1: Eine UNIQUE-Einschränkung testen

Eine UNIQUE-Einschränkung stellt sicher, dass alle Werte in einer Spalte unterschiedlich sind. In der Tabelle truck haben Sie die Spalte truck_email als NOT NULL und UNIQUE definiert.

Angesichts der UNIQUE-Einschränkung schlägt die Anweisung fehl, wenn Sie versuchen, zwei Datensätze mit der gleichen E-Mail-Adresse einzufügen. Um diese Verhaltensweise zu testen, führen Sie die folgenden Befehle aus.

Beginnen Sie damit, eine bestehende E-Mail-Adresse auszuwählen und eine Variable truck_email für diese Zeichenfolge festzulegen. Wählen Sie dann den Maximalwert von truck_id aus der Tabelle aus und legen Sie eine weitere Variable max_truck_id für diesen Wert fest. Als Nächstes legen Sie eine dritte Variable new_truck_id fest, die max_truck_id um 1 erhöht. Dieses Verfahren stellt sicher, dass Sie beim Einfügen einer neuen Zeile nicht auf den Fehler „Primärschlüssel existiert bereits“ stoßen.

Fügen Sie schließlich die neue Zeile ein.

SET truck_email = (SELECT truck_email FROM truck LIMIT 1);
SET max_truck_id = (SELECT MAX(truck_id) FROM truck);
SET new_truck_id = $max_truck_id+1;
INSERT INTO truck VALUES
  ($new_truck_id,2,'Stockholm','Stockholm län','Stockholm','Sweden','SE',1,2001,'Freightliner','MT45 Utilimaster',0,276,'2020-10-01',$truck_email,CURRENT_TIMESTAMP());
Copy

Die INSERT-Anweisung schlägt fehl und Sie erhalten die folgende Fehlermeldung:

Duplicate key value violates unique constraint SYS_INDEX_TRUCK_UNIQUE_TRUCK_EMAIL

Erstellen Sie nun eine neue eindeutige E-Mail-Adresse und fügen Sie einen neuen Datensatz in die Tabelle truck ein:

SET new_unique_email = CONCAT($new_truck_id, '_truck@email.com');
INSERT INTO truck VALUES ($new_truck_id,2,'Stockholm','Stockholm län','Stockholm','Sweden','SE',1,2001,'Freightliner','MT45 Utilimaster',0,276,'2020-10-01',$new_unique_email,CURRENT_TIMESTAMP());
Copy

Die INSERT-Anweisung sollte dieses Mal erfolgreich ausgeführt werden.

Schritt 4.2: Eine FOREIGN KEY-Einschränkung testen

In diesem Schritt testen Sie eine FOREIGN KEY-Einschränkung.

Zeigen Sie zunächst die DDL an, die Sie zur Erstellung der Tabelle order_header verwendet haben, indem Sie die Funktion GET_DDL ausführen. Beachten Sie die FOREIGN KEY-Einschränkung für die Spalte truck_id in der Ausgabe.

SELECT GET_DDL('table', 'order_header');
Copy

Die Ausgabe dieses Befehls sieht ähnlich aus wie das folgende Teilergebnis:

Ausgabe von get_ddl auf der Tabelle order_header

Versuchen Sie nun, einen neuen Datensatz in die Tabelle order_header einzufügen, wobei Sie eine nicht existierende Truck-ID verwenden.

SET max_order_id = (SELECT MAX(order_id) FROM order_header);
SET new_order_id = ($max_order_id +1);
SET no_such_truck_id = -1;
INSERT INTO order_header VALUES
  ($new_order_id,$no_such_truck_id,6090,0,0,0,'16:00:00','23:00:00','','2022-02-18 21:38:46.000','','USD',17.0000,'','',17.0000,'');
Copy

Die INSERT-Anweisung sollte fehlschlagen, da sie gegen die FOREIGN KEY-Einschränkung in der Tabelle truck verstößt. Sie sollten die folgende Fehlermeldung erhalten:

Foreign key constraint SYS_INDEX_ORDER_HEADER_FOREIGN_KEY_TRUCK_ID_TRUCK_TRUCK_ID was violated.

Verwenden Sie nun die neue Variable new_truck_id, die Sie zuvor verwendet haben, und fügen Sie einen neuen Datensatz in die Tabelle order_header ein:

INSERT INTO order_header VALUES
  ($new_order_id,$new_truck_id,6090,0,0,0,'16:00:00','23:00:00','','2022-02-18 21:38:46.000','','USD',17.0000,'','',17.0000,'');
Copy

Die INSERT-Anweisung sollte dieses Mal erfolgreich ausgeführt werden.

Schritt 4.3: Versuch, eine Tabelle zu kürzen, die von einer FOREIGN KEY-Einschränkung referenziert wird

Als Nächstes können Sie überprüfen, dass eine Tabelle, auf die von einer FOREIGN KEY-Einschränkung referenziert wird, nicht gekürzt werden kann, solange die Fremdschlüsseleinschränkung existiert. Führen Sie die folgende TRUNCATE TABLE-Anweisung aus:

TRUNCATE TABLE truck;
Copy

Die Anweisung sollte fehlschlagen und Sie sollten die folgende Fehlermeldung erhalten:

91458 (0A000): Hybrid table 'TRUCK' cannot be truncated as it is involved in active foreign key constraints.

Schritt 4.4. Eine Zeile löschen, die von einer FOREIGN KEY-Einschränkung referenziert wird

Als Nächstes können Sie überprüfen, dass ein Datensatz, der von einer FOREIGN KEY-Einschränkung referenziert wird, nicht gelöscht werden kann, solange die Fremdschlüsseleinschränkung besteht. Führen Sie die folgende DELETE-Anweisung aus:

DELETE FROM truck WHERE truck_id = $new_truck_id;
Copy

Die Anweisung sollte fehlschlagen und Sie sollten die folgende Fehlermeldung erhalten:

Foreign keys that reference key values still exist.

Um einen Datensatz zu löschen, der von einer FOREIGN KEY-Einschränkung referenziert wird, müssen Sie zuerst den entsprechenden Datensatz aus der Tabelle order_header löschen. Dann können Sie den referenzierten Datensatz aus der Tabelle truck löschen. Führen Sie die folgenden DELETE-Anweisungen aus:

DELETE FROM order_header WHERE order_id = $new_order_id;
DELETE FROM truck WHERE truck_id = $new_truck_id;
Copy

Beide Anweisungen sollten erfolgreich ausgeführt werden.

Schritt 5: Sperren auf Zeilenebene verwenden, um parallele Aktualisierungen durchzuführen

Im Gegensatz zu Standardtabellen, die Sperren auf Partitions- oder Tabellenebene verwenden, verwenden Hybridtabellen Sperren auf Zeilenebene für Aktualisierungsoperationen. Sperren auf Zeilenebene ermöglichen parallele Aktualisierungen unabhängiger Datensätze, sodass Transaktionen nicht auf vollständige Tabellensperren warten müssen. Bei Anwendungen, die auf hohen transaktionalen Workloads basieren, müssen die Wartezeiten für Sperren auf ein Minimum reduziert werden, damit gleichzeitige Vorgänge sehr häufig auf dieselbe Tabelle zugreifen können.

In diesem Schritt können Sie parallele Aktualisierungen verschiedener Datensätze in der Hybridtabelle order_header testen.

Sie verwenden das Hauptarbeitsblatt Hybrid Tables - QuickStart, das Sie zuvor erstellt haben, und erstellen ein neues Arbeitsblatt mit dem Namen Hybrid Tables - QuickStart Session 2, um eine neue Sitzung zu simulieren. Vom Arbeitsblatt Hybrid Tables - QuickStart starten Sie eine neue Transaktion mit der BEGIN-Anweisung und führen dann eine UPDATE-Anweisung (eine DML-Operation) aus. Bevor Sie die Anweisung für die Transaktion COMMIT ausführen, öffnen Sie das Arbeitsblatt Hybrid Tables - QuickStart Session 2 und führen eine weitere UPDATE-Anweisung aus.- Zum Schluss bestätigen Sie die offene Transaktion.

Schritt 5.1: Neues Arbeitsblatt erstellen

Klicken Sie unter Worksheets auf die Schaltfläche + rechts in der Snowsight und wählen Sie dann SQL Worksheet.

Benennen Sie das Arbeitsblatt um, indem Sie seinen automatisch generierten Zeitstempelnamen auswählen und Hybrid Tables - QuickStart Session 2 eingeben. Dieses neue Arbeitsblatt wird nur für den aktuellen Schritt verwendet.

Schritt 5.2: Parallele Aktualisierungen ausführen

Öffnen Sie zunächst das Arbeitsblatt Hybrid Tables - QuickStart. Vergewissern Sie sich, dass Sie die richtige Rolle, das richtige Warehouse, die richtige Datenbank und das richtige Schema verwenden, und wählen Sie dann die Variable max_order_id aus.

USE ROLE hybrid_quickstart_role;
USE WAREHOUSE hybrid_quickstart_wh;
USE DATABASE hybrid_quickstart_db;
USE SCHEMA data;

SET max_order_id = (SELECT MAX(order_id) FROM order_header);
SELECT $max_order_id;
Copy

Beachten Sie den Wert der Variable max_order_id.

Starten Sie eine neue Transaktion und führen Sie die erste UPDATE-Anweisung aus.

BEGIN;
UPDATE order_header
  SET order_status = 'COMPLETED'
  WHERE order_id = $max_order_id;
Copy

Beachten Sie, dass Sie die Transaktion nicht mit einem Commit ausgeführt haben, sodass jetzt eine offene Sperre für die Zeile besteht, die diese Bedingung erfüllt:

WHERE order_id = $max_order_id
Copy

Führen Sie den Befehl SHOW TRANSACTIONS aus, der eine einzelne offene Transaktion zurückgeben sollte.

SHOW TRANSACTIONS;
Copy

Die Ausgabe dieses Befehls sieht ähnlich aus wie das folgende Teilergebnis:

Ausgabe des Befehls SHOW TRANSACTIONS, der eine offene Transaktion anzeigt

Öffnen Sie das Arbeitsblatt Hybrid Tables - QuickStart Session 2. Vergewissern Sie sich, dass Sie die richtige Rolle, das richtige Warehouse, die richtige Datenbank und das richtige Schema verwenden, und wählen Sie dann die Variable min_order_id aus.

USE ROLE hybrid_quickstart_role;
USE WAREHOUSE hybrid_quickstart_wh;
USE DATABASE hybrid_quickstart_db;
USE SCHEMA data;
Copy
SET min_order_id = (SELECT MIN(order_id) FROM order_header);
SELECT $min_order_id;
Copy

Beachten Sie, dass der Wert min_order_id ein anderer ist als der Wert max_order_id, den Sie in der ersten UPDATE-Anweisung verwendet haben. Führen Sie die zweite UPDATE-Anweisung aus.

UPDATE order_header
  SET order_status = 'COMPLETED'
  WHERE order_id = $min_order_id;
Copy

Da Hybridtabellen Sperren auf Zeilenebene verwenden und die offene Transaktion die Zeile WHERE order_id = $MAX_ORDER_ID sperrt, läuft die UPDATE- Anweisung erfolgreich.

Öffnen Sie das Arbeitsblatt Hybrid Tables - QuickStart und führen Sie ein Commit für die offene Transaktion aus.

COMMIT;
Copy

Führen Sie die folgende Abfrage aus, um die aktualisierten Datensätze anzuzeigen:

SELECT * FROM order_header WHERE order_status = 'COMPLETED';
Copy

Die Ausgabe dieses Befehls sieht ähnlich aus wie das folgende Teilergebnis:

SELECT result from order_header table where order_status is completed

Schritt 6: Konsistenz zeigen

Bei diesem Schritt lernen Sie ein einzigartiges Feature für Hybridtabellen kennen: die Möglichkeit, Operationen mit mehreren Anweisungen nativ, einfach und effektiv in einer einzigen konsistenten atomaren Transaktion auszuführen, wobei Sie sowohl auf Hybridtabellen als auch auf Standardtabellen zugreifen können. Snowflake-Transaktionen garantieren die „ACID“-Eigenschaften der Atomarität, Konsistenz, Isolation und Dauerhaftigkeit. Jede Transaktion wird als atomare Einheit behandelt, bewahrt einen konsistenten Datenbankzustand, wenn Schreibvorgänge stattfinden, ist von anderen gleichzeitigen Transaktionen isoliert (als ob sie sequenziell aufgeführt würden) und ist dauerhaft (der Commit bleibt nach der Ausführung dauerhaft bestehen).

In diesem Beispiel erwirbt das Unternehmen einen neuen Trucks desselben Modells wie ein bereits vorhandener Truck. Folglich müssen Sie die Spalte year für den entsprechenden Datensatz in der Hybridtabelle truck aktualisieren, um die Änderung wiederzugeben. Nach dieser Aktualisierung müssen Sie sofort eine Zeile aktualisieren und eine neue Zeile in der Tabelle truck_history einfügen. In dieser Standardtabelle werden alle Änderungen an der Truck-Flotte im Laufe der Zeit erfasst und gespeichert. Sie führen alle diese Schritte im Rahmen einer explizit bestätigten Transaktion durch.

Schritt 6.1: Eine einzelne Transaktion ausführen, die mehrere DML-Anweisungen enthält

Öffnen Sie das ursprüngliche Arbeitsblatt Hybrid Tables - QuickStart.

Starten Sie eine neue Transaktion, um sicherzustellen, dass eine nachfolgende Reihe von Operationen als eine einzige, atomare Einheit behandelt wird. Führen Sie dann mehrere DML-Anweisungen aus:

  • Aktualisieren Sie den entsprechenden Truck-Datensatz in der Hybridtabelle truck.

  • Aktualisieren Sie den entsprechenden Datensatz in der Tabelle truck_history, indem Sie die Einstellung record_end_time vornehmen, um das Ende seiner Gültigkeit zu markieren.

  • Fügen Sie einen neuen Datensatz in die Tabelle truck_history ein, um die aktualisierten Informationen zu erfassen.

Zum Schluss bestätigen Sie die Transaktion.

BEGIN;
SET CURRENT_TIMESTAMP = CURRENT_TIMESTAMP();
UPDATE truck SET year = '2024', record_start_time=$CURRENT_TIMESTAMP WHERE truck_id = 1;
UPDATE truck_history SET record_end_time=$CURRENT_TIMESTAMP WHERE truck_id = 1 AND record_end_time IS NULL;
INSERT INTO truck_history SELECT *, NULL AS record_end_time FROM truck WHERE truck_id = 1;
COMMIT;
Copy

Schritt 6.2: Ergebnisse prüfen

Führen Sie nun die folgenden SELECT-Abfragen aus, um die Ergebnisse der UPDATE- und INSERT-Anweisungen zu überprüfen.

Die erste Abfrage sollte zwei Zeilen zurückgeben, die zweite Abfrage eine.

SELECT * FROM truck_history WHERE truck_id = 1;
Copy

Die Ausgabe dieses Befehls sieht ähnlich aus wie das folgende Teilergebnis:

Ausgabe der Abfrage truck_history, die zwei Zeilen zurückgibt
SELECT * FROM truck WHERE truck_id = 1;
Copy

Die Ausgabe dieses Befehls sieht ähnlich aus wie das folgende Teilergebnis:

Ausgabe einer Truck-Abfrage, die eine Zeile liefert

Schritt 7: Eine Hybridtabelle mit einer Standardtabelle verknüpfen

In diesem Schritt führen Sie eine Join-Abfrage aus, die Daten aus einer Hybridtabelle (order_header) und einer Standardtabelle (truck_history) kombiniert. Diese Abfrage demonstriert die Interoperabilität der beiden Tabellentypen.

Schritt 7.1: Daten in den Tabellen ansehen

Zuvor haben Sie die Tabelle order_header erstellt und geladen. Jetzt können Sie einige Abfragen durchführen und einige Informationen überprüfen, um sich mit der Tabelle vertraut zu machen. Listen Sie zunächst mit dem Befehl SHOW TABLES die Tabellen in der Datenbank auf und wählen Sie dann zwei Spalten aus der Ausgabe dieser Liste aus.

SHOW TABLES IN DATABASE hybrid_quickstart_db;
SELECT "name", "is_hybrid" FROM TABLE(RESULT_SCAN(last_query_id()));
Copy

Die Ausgabe dieses Befehls sieht ähnlich aus wie das folgende Teilergebnis:

Abfrage, die zeigt, ob Tabellen hybrid sind

Führen Sie nun zwei einfache Abfragen durch:

SELECT * FROM truck_history LIMIT 10;
SELECT * FROM order_header LIMIT 10;
Copy

Die Ausgabe der zweiten Abfrage sieht ähnlich aus wie das folgende Teilergebnis:

Abfrage, die 10 Zeilen aus der Tabelle order_header zurückgibt

Schritt 7.2: Eine Hybridtabelle mit einer Standardtabelle verknüpfen

Um die Hybridtabelle order_header mit der Standardtabelle truck_history zu verknüpfen, führen Sie die folgende SET-Anweisung und -Abfrage aus. Das Verknüpfen von Hybridtabellen mit Standardtabellen erfordert keine spezielle Syntax.

SET order_id = (SELECT order_id FROM order_header LIMIT 1);

SELECT hy.*,st.*
  FROM order_header AS hy JOIN truck_history AS st ON hy.truck_id = st.truck_id
  WHERE hy.order_id = $order_id
    AND st.record_end_time IS NULL;
Copy

Das Verknüpfungsergebnis sieht ähnlich aus wie das folgende Teilergebnis:

Abfrage, die die Ergebnisse einer Verknüpfung zwischen einer Hybridtabelle und einer Standardtabelle zurückgibt

Schritt 8. Sicherheit und Governance demonstrieren

In diesem Schritt führen Sie zwei sicherheitsrelevante Beispiele aus, um zu demonstrieren, dass die Snowflake-Funktionen für Sicherheit und Governance gleichermaßen für Standard- und Hybridtabellen gelten.

Die Erteilung von Berechtigungen für diese Rollen sind Standardmechanismen zur Durchsetzung der Sicherheit, wenn eine große Anzahl von Datenbankbenutzern Zugriff auf dasselbe System hat, unabhängig davon, ob es sich um einen transaktionalen, analytischen oder hybriden Workload handelt.

Schritt 8.1: Zugriffssteuerung für Hybridtabellen und die Benutzerverwaltung einrichten

Die rollenbasierte Zugriffssteuerung (RBAC) funktioniert für Hybridtabellen und Standardtabellen gleich. Sie können den Zugriff auf Daten aus Hybridtabellen in Snowflake verwalten, indem Sie bestimmten Rollen Berechtigungen erteilen.

Erstellen Sie zunächst eine neue hybrid_quickstart_bi_user_role-Rolle. Verwenden Sie die Rolle ACCOUNTADMIN, um die neue Rolle zu erstellen.

USE ROLE ACCOUNTADMIN;
CREATE ROLE hybrid_quickstart_bi_user_role;
SET my_user = CURRENT_USER();
GRANT ROLE hybrid_quickstart_bi_user_role TO USER IDENTIFIER($my_user);
Copy

Jetzt können Sie der neuen Rolle USAGE-Berechtigungen für das Warehouse hybrid_quickstart_wh, die Datenbank hybrid_quickstart_db und alle dazugehörigen Schemas erteilen. Verwenden Sie hybrid_quickstart_role, um die GRANT-Anweisungen auszuführen.

USE ROLE hybrid_quickstart_role;
GRANT USAGE ON WAREHOUSE hybrid_quickstart_wh TO ROLE hybrid_quickstart_bi_user_role;
GRANT USAGE ON DATABASE hybrid_quickstart_db TO ROLE hybrid_quickstart_bi_user_role;
GRANT USAGE ON ALL SCHEMAS IN DATABASE hybrid_quickstart_db TO hybrid_quickstart_bi_user_role;
Copy

Versuchen Sie mit der neuen Rolle (hybrid_quickstart_bi_user_role), einige Daten aus der Tabelle order_header auszuwählen.

USE ROLE hybrid_quickstart_bi_user_role;
USE DATABASE hybrid_quickstart_db;
USE SCHEMA data;

SELECT * FROM order_header LIMIT 10;
Copy

Sie können keine Daten auswählen, da die Rolle hybrid_quickstart_bi_user_role nicht die erforderliche SELECT-Berechtigung für die Tabellen erhalten hat. Sie erhalten die folgende Fehlermeldung:

Object 'ORDER_HEADER' does not exist or not authorized.

Sie können dieses Problem lösen, indem Sie die Rolle hybrid_quickstart_role verwenden, um SELECT-Berechtigungen für alle Tabellen des Schemas data an die hybrid_quickstart_bi_user_role zu vergeben.

USE ROLE hybrid_quickstart_role;
GRANT SELECT ON ALL TABLES IN SCHEMA DATA TO ROLE hybrid_quickstart_bi_user_role;
Copy

Versuchen Sie erneut, Daten aus der Hybridtabelle order_header auszuwählen.

USE ROLE hybrid_quickstart_bi_user_role;
SELECT * FROM order_header LIMIT 10;
Copy

Diesmal ist die Abfrage erfolgreich, da die HYBRID_QUICKSTART_BI_USER_ROLE über die entsprechenden Berechtigungen auf allen Ebenen der Hierarchie verfügt. Die Ausgabe sieht ähnlich aus wie das folgende Teilergebnis:

Abfrage, die jetzt den Zugriff auf order_header erlaubt, nachdem die SELECT-Berechtigung für das Schema DATA erteilt wurde

Schritt 8.2: Eine Maskierungsrichtlinie erstellen und implementieren

In diesem Schritt erstellen Sie eine Maskierungsrichtlinie und wenden sie auf die Spalte truck_email in der Hybridtabelle truck an, indem Sie die Anweisung ALTER TABLE … ALTER COLUMN verwenden. Eine Maskierungsrichtlinie ist eine Standardmethode zur Steuerung der Sichtbarkeit von Daten auf Spaltenebene für Benutzer mit unterschiedlichen Rollen und Berechtigungen.

Bemerkung

Um Maskierungsrichtlinien zu erstellen, müssen Sie ein Konto der Enterprise Edition (oder ein übergeordnetes Konto) verwenden. Wenn Sie ein Konto der Standard Edition verwenden, überspringen Sie diesen Schritt. Weitere Informationen dazu finden Sie unter Snowflake-Editionen.

Verwenden Sie die Rolle hybrid_quickstart_role und erstellen Sie dann die neue Maskierungsrichtlinie, die dazu dient, komplette Spaltenwerte vor nicht autorisierten Rollen zu verbergen.

USE ROLE hybrid_quickstart_role;

CREATE MASKING POLICY hide_column_values AS
  (col_value VARCHAR) RETURNS VARCHAR ->
    CASE WHEN CURRENT_ROLE() IN ('HYBRID_QUICKSTART_ROLE') THEN col_value
      ELSE '***MASKED***'
      END;
Copy

Wenden Sie diese Richtlinie nun auf die Hybridtabelle an.

ALTER TABLE truck MODIFY COLUMN truck_email
  SET MASKING POLICY hide_column_values USING (truck_email);
Copy

Da Sie derzeit die hybrid_quickstart_role verwenden, sollte die Spalte truck_email nicht maskiert werden. Führen Sie die folgende Abfrage aus:

SELECT * FROM truck LIMIT 10;
Copy
Abfrage, bei der die Spalte truck_email nicht maskiert wird

Wechseln Sie zu HYBRID_QUICKSTART_BI_USER_ROLE und führen Sie die Abfrage erneut aus. Die Spalte TRUCK_EMAIL sollte jetzt maskiert sein.

USE ROLE hybrid_quickstart_bi_user_role;
SELECT * FROM truck LIMIT 10;
Copy
Abfrage, bei der die Spalte truck_email maskiert wird

Schritt 9. Bereinigen, Fazit und weitere Lektüre

Bereinigen

Um Ihre Snowflake Umgebung zu bereinigen, führen Sie die folgenden SQL-Anweisungen aus:

USE ROLE hybrid_quickstart_role;
USE WAREHOUSE hybrid_quickstart_wh;
USE DATABASE hybrid_quickstart_db;
USE SCHEMA data;
Copy
DROP DATABASE hybrid_quickstart_db;
DROP WAREHOUSE hybrid_quickstart_wh;
USE ROLE ACCOUNTADMIN;
DROP ROLE hybrid_quickstart_role;
DROP ROLE hybrid_quickstart_bi_user_role;
Copy

Löschen Sie schließlich manuell die Arbeitsblätter Hybrid Tables - QuickStart und Hybrid Tables - QuickStart Session 2.

Zusammenfassung

In diesem Tutorial haben Sie gelernt, wie Sie:

  • Erstellen und Laden von Hybridtabellen in einem Schritten.

  • Erstellen und Überprüfen der Durchsetzung der UNIQUE-, PRIMARY KEY- und FOREIGN KEY-Einschränkungen.

  • Ausführen paralleler Aktualisierungen, die von Sperren auf Zeilenebene abhängig sind.

  • Ausführen einer Operation mit mehreren Anweisungen in einer konsistenten atomaren Transaktion (über Hybrid- und Standardtabellen hinweg).

  • Abfragen von Hybridtabellen und Verknüpfen von Hybridtabellen mit Standardtabellen.

  • Sicherstellen, dass die Sicherheits- und Governance-Prinzipien sowohl für Hybrid- als auch für Standardtabellen gelten.