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

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

注釈

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

CREATE HYBRID TABLE オプション

ハイブリッド・テーブルは次のいずれかの方法で作成できます。

  • CREATE HYBRID TABLE。以下の例では、必須 PRIMARY KEY 制約を持つハイブリッドテーブルを作成し、行を挿入し、行を削除し、テーブルに問い合わせます。

    CREATE OR REPLACE HYBRID TABLE application_log (
      id NUMBER PRIMARY KEY AUTOINCREMENT,
      col1 VARCHAR(20),
      col2 VARCHAR(20) NOT NULL
      );
    
    INSERT INTO application_log (col1, col2) VALUES ('A1', 'B1');
    INSERT INTO application_log (col1, col2) VALUES ('A2', 'B2');
    INSERT INTO application_log (col1, col2) VALUES ('A3', 'B3');
    INSERT INTO application_log (col1, col2) VALUES ('A4', 'B4');
    
    SELECT * FROM application_log;
    
    UPDATE application_log SET col2 = 'B3-updated' WHERE id = 3;
    
    DELETE FROM application_log WHERE id = 4;
    
    SELECT * FROM application_log;
    
    Copy
  • CREATE HYBRID TABLE ... AS SELECT (CTAS) または CREATE HYBRID TABLE ... LIKE。例:

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

データのロード

注釈

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

最適化された一括ロード

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

一括ロードの最適化は、テーブルが一度も記録がロードされることなく新しく作成されるか、 CTAS クエリを使用して作成されるかに依存関係します。

ハイブリッド・テーブルが空の場合、3つのロード・メソッド (CTAS, COPY, INSERT INTO ... SELECT) はすべて、最適化されたバルク・ロードを使用してロード処理を高速化します。テーブルがロードされた後は、通常のパフォーマンス (INSERT) が適用されます。COPY、 INSERT INTO ... SELECT、インクリメンタルバッチロードを実行することはできますが、一般的に効率が悪くなります。バルクロードの速度は1分間に約100万記録が一般的ですが、テーブルの構造によって大きく異なる場合があります(たとえば、記録が大きいほどロードは遅くなります)。最適化された一括ロードは、将来のリリースで増分一括ロードをサポートするように拡張される予定です。

Snowsight クエリプロファイルで Statistics の情報を確認することで、バルクロード高速パスが使用されたかどうかを確認できます。高速パスが使用されている場合、 Number of rows insertedNumber 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を使用すると、操作中にテーブルをロッすることなく、同時にインデックスを作成できます。

注釈

SHOW INDEXES コマンドでインデックスの構築ステータスを確認します。一度に1つのインデックス構築のみがサポートされています。

しかし、ハイブリッドテーブルアプリケーションが開発中またはテストモードであり、テーブルのダウンタイムが問題にならない場合、ハイブリッドテーブルを再作成し、最適化された一括ロードを実行してインデックスを作成する方が、 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 NUMBER(38,0) 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

すべてのハイブリッドテーブルには一意の主キーが必要です。ハイブリッドテーブルのデータは、この主キーによって順序付けられます。プライマリ・キー以外の属性にもセカンダリ・インデックスを作成し、その属性に沿った検索を高速化することができます。クエリ述語が以下の条件のいずれかを使用する場合、インデックスはスキャンされる記録数を減らすことができるかもしれません。

注意

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

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

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

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

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

インデックスのサイズは幅に制限があります。ハイブリッド・テーブルの列にインデックスを構築する場合、特に大容量の列にインデックスを構築する場合、テーブルをロードするコマンド (CTAS、 COPY、または INSERT INTO ... SELECT を含む)が以下のエラーを返すことがあります。この場合、テーブルには IDX_HT100_COLS というインデックスが含まれています:

The value is too long for index "IDX_HT100_COLS".

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

テーブルを作成する際に、セカンダリインデックスに INCLUDE 列を使用してみることもできます。簡単な例は、 INCLUDE 列でセカンダリインデックスを作成する を参照してください。(INCLUDE 列はハイブリッドテーブルを作成する際にサポートされますが、 CREATE INDEX コマンドでインデックスを作成する際にはサポートされません)。