ハイブリッドテーブルを作成する

このトピックでは、Snowflakeで ハイブリッドテーブル を作成する概要について説明します。

注釈

ハイブリッドテーブルを作成するには、セッションの現在のウェアハウスとして指定された実行中のウェアハウスが必要です。ハイブリッドテーブルの作成時に実行中のウェアハウスが指定されていないと、エラーが発生する場合があります。詳細については、 ウェアハウスでの作業 をご参照ください。

CREATE HYBRID TABLE オプション

ハイブリッドテーブルを作成するには、次の SQL コマンドのいずれかを使用します。

  • CREATE HYBRID TABLE。この例では、ハイブリッドテーブルを作成し、そこに行を挿入し、行を削除し、テーブルをクエリします。

    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) または CREATE HYBRID TABLE ... LIKE。例:

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

データのロード

注釈

ハイブリッドテーブルのプライマリストレージは行ストアであるため、ハイブリッドテーブルのストレージフットプリントは通常、標準テーブルよりも大きくなります。この違いの主な理由は、標準テーブルの列データは、しばしば高い圧縮率を達成するからです。ストレージコストの詳細については、 ハイブリッドテーブルのコスト評価 をご参照ください。

最適化された一括ロード

ハイブリッドテーブルへのデータの一括ロードは、データステージまたは他のテーブルからのコピー(CTASCOPY INTO <テーブル>、または INSERT INTO ... SELECT を使用)によって行うことができます。

一括ロードの最適化は、テーブルが空かどうかに依存します。この文脈では、テーブルが空であるとみなされるのは、行が一度もロードされていない場合だけです。行が削除された既存のテーブルは空とはみなされません。本当に空なのは、まだ何もロードされていないテーブルや、 CTAS でロードされる作成中のテーブルです。

ハイブリッドテーブルが空の場合、3つのロード方法(CTAS、 COPY、 INSERT INTO ... SELECT)はすべて最適化された一括ロードを使用します。これはハイブリッドテーブルにデータを挿入するための高速実行モデルです。

現在、ハイブリッドテーブルが空でない場合、最適化された一括ロードは使用されません。COPY および INSERT INTO ... SELECT 演算子による増分一括ロードも可能ですが、通常、効率は低下します。1分あたり約100万記録のロード速度が表示されるはずですが、この見積もりはテーブルの構造に依存することに注意してください(例えば、より大きな記録はロードが遅くなります)。ロード、更新、マージに時間がかかりすぎて失敗する場合は、より小さなデータセットでテストするか、これらの操作をより小さなチャンクに分割してください。最適化された一括ロードは、将来のリリースで増分一括ロードをサポートするように拡張される予定です。

Snowsight のクエリプロファイルで Statistics の情報を確認すると、一括ロード高速パスが使用されたかどうかを確認できます。 Number of rows inserted は、高速パスが使用された場合、 Number of rows bulk loaded と呼ばれます。例えば、この CTAS 演算子は200000行を新しいテーブルに一括ロードします。

最適化された一括ロードを使用する CTAS クエリプロファイル

同じテーブルへの後続の増分一括ロードでは、最適化された一括ロードは使用されません。

クエリプロファイルの詳細については、 ハイブリッドテーブルのクエリプロファイルの分析 および クエリ履歴でクエリのアクティビティをモニターする をご参照ください。

注意

CTAS コマンドは FOREIGN KEY 制約をサポートしていません。ハイブリッドテーブルに FOREIGN KEY 制約が必要な場合は、 COPY または INSERT INTO ... SELECT を使用してテーブルをロードします。

注釈

Snowflakeテーブルにデータをロードする他の方法(Snowpipeなど)は、現在サポートされていません。

ハイブリッドテーブルにインデックスを追加する

ハイブリッドテーブルの作成時に、キー、インデックス、制約を定義できます。例:

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

オプションとして、 CREATE INDEX を使用して既存のハイブリッドテーブルにインデックスを作成できます。ワークロードでアクティブに使用され、クエリを提供している、または外部キーを持つハイブリッドテーブルにインデックスを追加するには、このコマンドを使用します。CREATE INDEXを使用すると、操作中にテーブルをロッすることなく、同時にインデックスを作成できます。

しかし、ハイブリッドテーブルアプリケーションが開発中またはテストモードであり、テーブルのダウンタイムが問題にならない場合、ハイブリッドテーブルを再作成し、最適化された一括ロードを実行してインデックスを作成する方が、 CREATE INDEX コマンドによるオンラインインデックス作成よりも効率的です。

最適化された一括ロードは、 CTAS、 COPY、 INSERT INTO ... SELECT でサポートされています。ただし、テーブルに FOREIGN KEY 制約がある場合は CTAS を使用できません。この例で作成された2番目のテーブル fk_hybrid_table は、 COPY または INSERT INTO ... SELECT で一括ロードする必要があります。

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

すべてのハイブリッドテーブルには一意の主キーが必要です。ハイブリッドテーブルのデータは、この主キーによって順序付けられます。主キー以外の属性にセカンダリインデックスを追加して、それらの属性に沿った検索を高速化できます。スキャンする記録数を減らすには、インデックスを =>>=<<=、IN 述語に活用できます。

注意

セカンダリインデックスを追加するには、ハイブリッドテーブルに SELECT 権限を付与されたロールを使用する必要があります。ハイブリッドテーブルのデータのビューにはアクセスでき、テーブル自体にはアクセスできない場合、セカンダリインデックスを追加できません。

特定の属性または複合属性グループに対する述語を含む一般的な繰り返しクエリがある場合は、パフォーマンスを向上させるために、その属性または属性グループにインデックスを追加することを検討してください。ただし、インデックスを使用する場合は次の点に注意してください。

  • インデックス内のデータのサブセットの追加コピーを保存すると、ストレージ消費量が増加します。

  • インデックスが同期的に維持されるため、 DMLs にオーバーヘッドが追加されます。

ロード中のインデックス構築エラー

ハイブリッドテーブルの列にインデックスを構築中の場合、特に多数の列にインデックスが構築されている場合、テーブルをロードするコマンド(CTAS、 COPY、または INSERT INTO ... SELECT を含む)は以下のエラーを返すことがあります。

The value is too long for index "IDX_HT100_COLS".

この例では、 IDX_HT100_COLS は作成されるテーブルのインデックス名です。

このエラーが発生するのは、行ベースのストレージでは記録ごとに保存できるデータ(およびメタデータ)のサイズに制限があるためです。記録サイズを小さくするには、大きな列(幅広の VARCHAR 列など)をインデックス列として指定せずにテーブルを作成してみてください。

また、列に直接インデックスを付ける代わりに、セカンダリインデックスに INCLUDE 列を使用してテーブルを作成してみることもできます。簡単な例は、 INCLUDE 列でセカンダリインデックスを作成する を参照してください。