Hybride Tabellen erstellen

Dieses Thema bietet eine Übersicht über das Erstellen von Hybridtabellen in Snowflake.

Bemerkung

Um eine Hybridtabelle zu erstellen, müssen Sie ein aktives Warehouse haben, das als aktuelles Warehouse Ihrer Sitzung angegeben ist. Es können Fehler auftreten, wenn beim Erstellen einer Hybridtabelle kein aktives Warehouse angegeben wird. Weitere Informationen dazu finden Sie unter Verwenden von Warehouses.

CREATEHYBRIDTABLE-Optionen

Sie können eine Hybridtabelle erstellen, indem Sie einen der folgenden SQL-Befehle verwenden:

  • CREATE HYBRID TABLE. Dieses Beispiel erstellt eine Hybridtabelle, fügt einige Zeilen ein, löscht eine Zeile und fragt die Tabelle ab:

    CREATE OR REPLACE HYBRID TABLE icecream (
      id NUMBER PRIMARY KEY AUTOINCREMENT START 1 INCREMENT 1,
      col1 VARCHAR NOT NULL,
      col2 VARCHAR NOT NULL
      );
    
    INSERT INTO icecream VALUES(1, 'A1', 'B1');
    INSERT INTO icecream VALUES(2, 'A2', 'B2');
    INSERT INTO icecream VALUES(3, 'A3', 'B3');
    INSERT INTO icecream VALUES(4, 'A4', 'B4');
    
    UPDATE icecream SET col2 = 'B3-updated' WHERE id = 3;
    
    DELETE FROM icecream WHERE id = 4;
    
    SELECT * FROM icecream;
    
    Copy
  • CREATE HYBRID TABLE :.. AS SELECT (CTAS) oder CREATE HYBRID TABLE … LIKE. Beispiel:

    CREATE OR REPLACE HYBRID TABLE table1 (
      employee_id INT PRIMARY KEY,
      department_id VARCHAR(200)
      )
    AS SELECT * FROM table2;
    
    Copy

Laden von Daten

Bemerkung

Da der primäre Speicher für Hybridtabellen ein Zeilenspeicher ist, haben Hybridtabellen in der Regel einen größeren Speicherplatzbedarf als Standardtabellen. Der Hauptgrund für den Unterschied ist, dass spaltenförmige Daten für Standardtabellen oft eine höhere Komprimierung erzielen. Weitere Informationen zu den Speicherkosten finden Sie unter Kosten für Hybridtabellen.

Optimiertes Massenladen

Sie können Daten in großen Mengen in Hybridtabellen laden, indem Sie sie entweder aus einem Stagingbereich oder aus anderen Tabellen kopieren (mit CTAS, COPY INTO <Tabelle> oder INSERT INTO. … SELECT).

Die Optimierung von Massenladen hängt davon ab, ob die Tabelle leer ist oder nicht. In diesem Zusammenhang gilt eine Tabelle nur dann als leer, wenn noch nie eine Zeile in sie geladen wurde. Eine bestehende Tabelle, deren Zeilen gelöscht wurden, wird nicht als leer betrachtet. Eine Tabelle, die gerade erstellt wurde und noch in keiner Weise geladen wurde, oder die mit CTAS erstellt und an Ort und Stelle geladen wird, ist wirklich leer.

Wenn eine Hybridtabelle leer ist, verwenden alle drei Lademethoden (CTAS, COPY und INSERT INTO. … SELECT) das optimierte Massenladen, ein schnelles Ausführungsmodell für das Einfügen von Daten in Hybridtabellen.

Wenn die Hybridtabellen nicht leer sind, wird das optimierte Massenladen derzeit nicht verwendet. Inkrementelles Batch-Laden mit COPY und INSERT INTO. … SELECT können trotzdem durchgeführt werden, ist aber in der Regel weniger effizient. Sie sollten Ladegeschwindigkeiten von ca. 1 Million Datensätzen pro Minute sehen. Beachten Sie jedoch, dass diese Schätzung von der Struktur der Tabelle abhängt (z. B. werden größere Datensätze langsamer geladen). Wenn Ihre Ladevorgänge, Aktualisierungen und Zusammenführungen zu lange dauern und fehlschlagen, testen Sie mit einem kleineren Datensatz oder teilen Sie diese Operationen in kleinere Blöcke auf. Das optimierte Massenladen wird in einem zukünftigen Release um die Unterstützung von inkrementellem Batch-Laden erweitert.

Sie können die Informationen von Statistics im Abfrageprofil unter Snowsight überprüfen, um festzustellen, ob der Massenladen-Schnellpfad verwendet wurde. Number of rows inserted wird als Number of rows bulk loaded bezeichnet, wenn der Schnellpfad verwendet wird. Diese CTAS-Operation lädt zum Beispiel 200.000 Zeilen in eine neue Tabelle:

CTAS-Abfrageprofil, das das optimierte Massenladen verwendet

Ein nachfolgendes inkrementelles Batch-Laden in dieselbe Tabelle würde kein optimiertes Massenladen verwenden.

Weitere Informationen zu Abfrageprofilen finden Sie unter Abfrageprofile für Hybridtabellen analysieren und Abfrageaktivität mit Abfrageverlauf überwachen.

Achtung

CTAS-Befehle unterstützen keine FOREIGN KEY-Einschränkungen. Wenn Ihre Hybridtabelle FOREIGN KEY-Einschränkungen erfordert, verwenden Sie COPY oder INSERT INTO. … SELECT, um die Tabelle zu laden.

Bemerkung

Andere Methoden zum Laden von Daten in Snowflake-Tabellen (z. B. Snowpipe) werden derzeit nicht unterstützt.

Hinzufügen von Indizes zu einer Hybridtabelle

Sie können alle Schlüssel, Indizes und Einschränkungen definieren, wenn Sie eine Hybridtabelle erstellen. Beispiel:

CREATE OR REPLACE HYBRID TABLE target_hybrid_table (
    col1 VARCHAR(32) PRIMARY KEY,
    col2 NUMBER(38,0) UNIQUE,
    col3 NUMBER(38,0),
    INDEX index_col3 (col3)
    )
  AS SELECT col1, col2, col3 FROM source_table);
Copy

Optional können Sie mit CREATE INDEX einen Index für eine bestehende Hybridtabelle erstellen. Verwenden Sie diesen Befehl, um einen Index zu einer Hybridtabelle hinzuzufügen, die aktiv für einen Workload verwendet wird und Abfragen bedient oder Fremdschlüssel hat. CREATE INDEX baut einen Index parallel auf, ohne dass die Tabelle während der Operation gesperrt wird.

Wenn sich Ihre hybride Tabellenanwendung jedoch im Entwicklungs- oder Testmodus befindet und eine gewisse Ausfallzeit für die Tabelle kein Problem darstellt, ist es effizienter, die hybride Tabelle neu zu erstellen und die Indizes durch Ausführen eines optimierten Massenladens zu erstellen, was effizienter ist als die Online-Indexerstellung mit dem Befehl CREATE INDEX.

Optimiertes Massenladen wird unterstützt für CTAS, COPY und INSERT INTO. … SELECT, aber Sie können CTAS nicht verwenden, wenn Ihre Tabelle eine FOREIGN KEY-Einschränkung hat. Die zweite in diesem Beispiel erstellte Tabelle, fk_hybrid_table, müsste mit COPY oder INSERT INTO. … SELECT gefüllt werden:

CREATE OR REPLACE HYBRID TABLE ref_hybrid_table (
    col1 VARCHAR(32) PRIMARY KEY,
    col2 INT UNIQUE);

CREATE OR REPLACE HYBRID TABLE fk_hybrid_table (
    col1 VARCHAR(32) PRIMARY KEY,
    col2 NUMBER(38,0),
    col3 NUMBER(38,0),
    FOREIGN KEY (col2) REFERENCES ref_hybrid_table(col2),
    INDEX index_col3 (col3)
);
Copy

Alle Hybridtabellen benötigen einen eindeutigen Primärschlüssel. Die Daten in einer Hybridtabelle sind nach diesem Primärschlüssel geordnet. Sie können zusätzliche sekundäre Indizes zu nicht primären Schlüsselattributen hinzufügen, um Lookups entlang dieser Attribute zu beschleunigen. Um die Anzahl der zu durchsuchenden Datensätze zu reduzieren, können für Indizes die Prädikate =, >, >=, <, <= und IN genutzt werden.

Achtung

Um einen sekundären Index hinzuzufügen, müssen Sie eine Rolle verwenden, die über die SELECT-Berechtigung für die Hybridtabelle verfügt. Wenn Sie Zugriff auf eine Ansicht der Daten in der Hybridtabelle haben, aber nicht auf Tabelle selbst, können Sie keinen sekundären Index hinzufügen.

Wenn Sie häufige, wiederholte Abfragen mit Prädikaten auf einem bestimmten Attribut oder eine zusammengesetzte Gruppe von Attributen haben, sollten Sie in Erwägung ziehen, einen Index für dieses Attribut oder diese Gruppe von Attributen hinzuzufügen, um die Leistung zu verbessern. Beachten Sie jedoch die folgenden Aspekte bei der Verwendung von Indizes:

  • Erhöhter Speicherbedarf bei der Speicherung zusätzlicher Kopien der Teilmenge von Daten im Index.

  • Hinzufügen von Overhead zu DMLs, da Indizes synchron verwaltet werden.

Fehler bei der Indexerstellung während des Ladens

Wenn Indizes für die Spalten einer Hybridtabelle erstellt werden, insbesondere Indizes für eine große Anzahl von Spalten, kann jeder Befehl, der die Tabelle lädt (einschließlich CTAS, COPY oder INSERT INTO. … SELECT), den folgenden Fehler zurückgeben:

The value is too long for index "IDX_HT100_COLS".

In diesem Beispiel ist IDX_HT100_COLS der Name eines Indexes in der zu erstellenden Tabelle.

Dieser Fehler tritt auf, weil der zeilenbasierte Speicher eine Beschränkung der Größe der Daten (und Metadaten) vorsieht, die pro Datensatz gespeichert werden können. Um die Datensatzgröße zu verringern, versuchen Sie, die Tabelle zu erstellen, ohne größere Spalten (wie breite VARCHAR-Spalten) als indizierte Spalten anzugeben.

Sie können auch versuchen, die Tabelle zu erstellen, indem Sie INCLUDE-Spalten auf sekundären Indizes verwenden, anstatt die Spalten direkt zu indizieren. Ein einfaches Beispiel finden Sie unter Sekundären Index mit einer INCLUDE-Spalte erstellen.