ハイブリッドテーブルを作成する¶
このトピックでは、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;
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;
データのロード¶
注釈
ハイブリッドテーブルのプライマリストレージは行ストアであるため、ハイブリッドテーブルのストレージフットプリントは通常、標準テーブルよりも大きくなります。この違いの主な理由は、標準テーブルの列データは、しばしば高い圧縮率を達成するからです。ストレージコストの詳細については、 ハイブリッドテーブルのコスト評価 をご参照ください。
データステージまたは他のテーブルからコピーすることによって(つまり、 CTAS、 COPY、または INSERT INTO ... SELECT を使用)、ハイブリッドテーブルにデータを一括ロードできますが、 CTAS ステートメントを使用してハイブリッドテーブルにデータを一括ロードすることを強くお勧めします。CTAS での一括ロードは、パフォーマンスが最適化されており、ほとんどの場合、大規模なロード(数百万件の記録)を他のオプションよりも約10倍速く実行することができます。
INSERT または COPY を介した一括ロードもサポートされていますが、大量のデータの場合はデータのロードが遅くなります。大規模なデータセットをロードする場合、長い待ち時間やタイムアウトが発生する可能性があります。最近ロードされたデータに対するクエリも遅くなります。近い将来、 COPY などの DML ステートメントの一括ロード最適化が計画されています。
注意
CTAS コマンドは外部キー制約をサポートしていません。ハイブリッドテーブルで外部キー制約を使用する必要がある場合は、 COPY または INSERT INTO ... SELECT などの別のロードオプションを使用します。
ソースデータがSnowflakeテーブルではなく外部ステージに存在する場合は、以下の構文を使用します。
CREATE TABLE ... AS SELECT * FROM @stage/data.csv
この構文の使用は避けてください。
COPY FROM @stage/data.csv
CTAS オプションは、より効率的なロード方法です。
CTAS を 使用しない 場合、1分あたり最大約100万件の記録をロードできます。ただし、この近似値はテーブルの構造(記録のサイズなどで、記録が大きいほどロードが遅くなります)に依存することに注意してください。ロード操作に時間がかかりすぎて失敗する場合は、より小さなデータセットでテストするか、ロードをより小さなチャンクに分割してください。
ハイブリッドテーブルの列にインデックスが構築されている場合、特に多数の列にインデックスが構築されている場合、テーブルをロードするコマンド(CTAS、 COPY、または INSERT INTO ... SELECT を含む)は以下のエラーを返すことがあります。
The value is too long for index "IDX_HT100_COLS".
ここで、 IDX_HT100_COLS
は作成されるテーブルのインデックス名です。
このエラーが発生するのは、行ベースのストレージでは記録ごとに保存できるデータ(およびメタデータ)のサイズに制限があるためです。記録サイズを小さくするには、大きな列(幅広の VARCHAR 列など)をインデックス列として指定せずにテーブルを作成してみてください。
また、列に直接インデックスを付ける代わりに、セカンダリインデックスに INCLUDE 列を使用してテーブルを作成してみることもできます。簡単な例は、 INCLUDE 列でセカンダリインデックスを作成する を参照してください。
注釈
Snowflakeテーブルにデータをロードする他の方法(Snowpipeなど)は、現在サポートされていません。
ハイブリッドテーブルにインデックスを追加する¶
ハイブリッドテーブルの作成時に、キー、インデックス、制約を定義できます。例:
CREATE OR REPLACE HYBRID TABLE targethybridtable (
col1 VARCHAR(32) PRIMARY KEY,
col2 NUMBER(38,0) UNIQUE,
col3 NUMBER(38,0),
INDEX index_col3 (col3)
)
AS SELECT col1, col2, col3 FROM sourcetable);
オプションとして、 CREATE INDEX を使用して既存のハイブリッドテーブルにインデックスを作成できます。ワークロードでアクティブに使用され、クエリを提供している、または外部キーを持つハイブリッドテーブルにインデックスを追加するには、このコマンドを使用します。CREATE INDEXを使用すると、操作中にテーブルをロッすることなく、同時にインデックスを作成できます。
しかし、ハイブリッドテーブルアプリケーションが開発またはテストモードであり、テーブルのダウンタイムが問題にならない場合は、ハイブリッドテーブルを再作成し、CTASコマンド内でインデックスを作成する方が効率的です。CTASコマンドが提供する一括ロード高速パスは、CREATEINDEXコマンドによるオンラインインデックス構築よりも効率的です。
ハイブリッドテーブルには一意の主キーが必要です。テーブルのデータは、この主キーによって順序付けられます。主キー以外の属性にセカンダリインデックスを追加して、それらの属性に沿った検索を高速化できます。スキャンする記録数を減らすには、インデックスを =
、 >
、 >=
、 <
、 <=
、IN 述語に活用できます。
注意
セカンダリインデックスを追加するには、ハイブリッドテーブルに SELECT 権限を付与されたロールを使用する必要があります。ハイブリッドテーブルのデータのビューにはアクセスでき、テーブル自体にはアクセスできない場合、セカンダリインデックスを追加できません。
特定の属性または複合属性グループに対する述語を含む一般的な繰り返しクエリがある場合は、パフォーマンスを向上させるために、その属性または属性グループにインデックスを追加することを検討してください。ただし、インデックスを使用する場合は次の点に注意してください。
インデックス内のデータのサブセットの追加コピーを保存すると、ストレージ消費量が増加します。
インデックスが同期的に維持されるため、 DMLs にオーバーヘッドが追加されます。