CREATE HYBRID TABLE¶
現在または指定のスキーマに新しいハイブリッドテーブルを作成するか、既存のテーブルを置き換えます。テーブルには複数の列を含めることができ、各列の定義は名前、データ型に加え、オプションで列に次があるかどうかにより構成されます。
NOT NULL 値を必要とする。
デフォルト値を持つか、アイデンティティ列である。
インライン制約がある。
さらに、このコマンドは次のバリアントをサポートしています。
CREATE HYBRIDTABLE ... AS SELECT (データが入ったテーブルを作成します。CTAS とも呼ばれます)
CREATE HYBRIDTABLE ... LIKE (既存ハイブリッドテーブルの空のコピーを作成します)
注釈
ハイブリッドテーブルの作成には、主キー制約が 必要 です。
標準的なSnowflakeテーブルに使用される完全な CREATE TABLE 構文については、 CREATE TABLE をご参照ください。
- こちらもご参照ください。
構文¶
CREATE [ OR REPLACE ] HYBRID TABLE [ IF NOT EXISTS ] <table_name>
( <col_name> <col_type>
[
{
DEFAULT <expr>
/* AUTOINCREMENT (or IDENTITY) is supported only for numeric data types (NUMBER, INT, FLOAT, etc.) */
| { AUTOINCREMENT | IDENTITY }
[
{
( <start_num> , <step_num> )
| START <num> INCREMENT <num>
}
]
[ { ORDER | NOORDER } ]
}
]
[ NOT NULL ]
[ inlineConstraint ]
[ , <col_name> <col_type> [ ... ] ]
[ , outoflineIndex ]
[ , ... ]
)
[ COMMENT = '<string_literal>' ]
条件:
inlineConstraint ::= [ CONSTRAINT <constraint_name> ] { UNIQUE | PRIMARY KEY | { [ FOREIGN KEY ] REFERENCES <ref_table_name> [ ( <ref_col_name> ) ] } } [ <constraint_properties> ]重要
ハイブリッドテーブルには、主キー制約が 必要 です。
外部キー制約は、ハイブリッドテーブルに適用されます。
一意制約と外部キー制約は、それぞれ独自の基になるインデックスを構築します。インデックスによって追加データが格納されます。インデックスを定義するには、テーブル作成時に一意制約を定義するか、外部キー制約を定義するか、インデックスを定義します。以下のアウトオブラインインデックスの定義は、カバリングインデックスの作成を可能にするために拡張されました。
インデックスを定義できるのは、半構造化されていない列(つまり、バリアント、オブジェクト、配列)のみです。含まれる列にも同じ制限があります。これは、各記録のキーのための基になるストレージエンジンに関連するスペースの制約によるものです。含まれる列は、テーブル作成時にのみ指定できます。
outoflineIndex ::= INDEX <index_name> ( <col_name> [ , <col_name> , ... ] )インライン制約の詳細については、 CREATE | ALTER TABLE ... CONSTRAINT をご参照ください。
ハイブリッドテーブル制約に関する制限については、 ハイブリッドテーブルでサポートされていない機能と制限事項 をご参照ください。
バリアント構文¶
CREATE HYBRIDTABLE ... AS SELECT (CTAS とも呼ばれる)
別のハイブリッドテーブルに対するクエリの結果を含む新しいハイブリッドテーブルを作成します。
CREATE [ OR REPLACE ] HYBRID TABLE <table_name> [ ( <col_name> [ <col_type> ] , <col_name> [ <col_type> ] , ... ) ] AS SELECT <query> [ ... ]注釈
CTAS を使用してハイブリッドテーブルを作成する場合は、主キー、インデックス、および制約を含むテーブルスキーマを明示的に定義します。SELECT ステートメントから推測したスキーマに依存しないでください。
CREATE HYBRID TABLE ... LIKE
既存のハイブリッドテーブルと同じ列定義を使用して新しいハイブリッドテーブルを作成しますが、既存のテーブルからはデータをコピーしません。
列名、タイプ、デフォルト、および制約が新しいテーブルにコピーされます。
CREATE [ OR REPLACE ] HYBRID TABLE <table_name> LIKE <source_table> [ ... ]注釈
現在、 HYBRID TABLE CREATE ... LIKE は、ソーステーブル型として別のハイブリッドテーブルのみをサポートしています。
データ共有を介してアクセスされる自動インクリメントシーケンスを持つテーブルに対する CREATE HYBRID TABLE ... LIKE は、現在サポートされて いません。
必須パラメーター¶
name
テーブルの識別子(つまり、名前)を指定します。テーブルが作成されるスキーマに対して一意である必要があります。
また、識別子はアルファベット文字で始まる必要があり、識別子文字列全体が二重引用符で囲まれていない限り、スペースや特殊文字を含めることはできません(例:
"My object"
)。二重引用符で囲まれた識別子も大文字と小文字が区別されます。詳細については、 識別子の要件 をご参照ください。
col_name
列識別子(名前)を指定します。テーブル識別子のすべての要件は、列識別子にも適用されます。
詳細については、 識別子の要件 および 予約済みおよび限定キーワード をご参照ください。
注釈
標準の予約キーワードに加えて、次のキーワードは ANSI標準コンテキスト関数用に予約されているため、列識別子として使用できません。
CURRENT_DATE
CURRENT_ROLE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_USER
予約済みキーワードのリストについては、 予約済みおよび限定キーワード をご参照ください。
col_type
列のデータ型を指定します。
テーブル列に指定できるデータ型の詳細については、 SQL データ型リファレンス をご参照ください。
query
AS SELECT (つまり、 CTAS)を使用する場合は必須
テーブルへの入力に使用される SELECT ステートメントを指定する文字列。
オプションのパラメーター¶
DEFAULT ...
または .AUTOINCREMENT ...
INSERT または CREATE HYBRID TABLE AS SELECT ステートメントで値が明示的に指定されていない場合に、デフォルト値を列に自動的に挿入するかどうかを指定します。
DEFAULT expr
列のデフォルト値は、次のいずれかの指定可能な式によって定義されます。
定数値。
単純式。
シーケンス参照(
seq_name.NEXTVAL
)。
単純式とは、スカラー値を返す式です。ただし、式に次の参照を含めることは できません。
サブクエリ。
集計。
ウィンドウ関数。
外部関数。
{ AUTOINCREMENT | IDENTITY }
.[ { ( start_num , step_num ) | START num INCREMENT num } ]
.[ { ORDER | NOORDER } ]
AUTOINCREMENT
が使用されている場合、列のデフォルト値は指定された数値で始まり、それに続く各値は自動的に生成されます。AUTOINCREMENT
列が生成する値は一意であることが保証されます。生成された値の任意のペア間における差は、インクリメント量の倍数であることが保証されます。オプションの
ORDER
とNOORDER
パラメーターは、生成された値が シーケンスのセマンティクス で指定された順序の保証を提供するかどうかを指定します。NOORDER
は、ハイブリッドテーブルのAUTOINCREMENT
列のデフォルトオプションです。NOORDER
は通常、ポイント記述のパフォーマンスを大幅に向上させます。これらのパラメーターは、数値データ型の列にのみ使用できます。
AUTOINCREMENT
とIDENTITY
は同義語です。列にいずれかが指定されている場合、Snowflakeはシーケンスを使用して列の値を生成します。シーケンスの詳細については、 シーケンスの使用 をご参照ください。開始とステップ/増分の両方のデフォルト値は
1
です。
デフォルト:値なし(列にデフォルト値なし)
注釈
DEFAULT
とAUTOINCREMENT
は、相互に排他的です。列には1つしか指定できません。パフォーマンスを重視するワークロードでは、
NOORDER
がAUTOINCREMENT
列の推奨オプションです。
CONSTRAINT ...
テーブル内の指定された列のインライン制約を定義します。
構文の詳細については、 CREATE | ALTER TABLE ... CONSTRAINT をご参照ください。制約の詳細については、 制約 をご参照ください。
COMMENT = 'string_literal'
テーブルのコメントを指定します。
デフォルト: 値なし
使用上の注意¶
ハイブリッドテーブルには、主キー制約が必要です。
ハイブリッドテーブルを再作成または置換するには、
CREATE [ OR REPLACE ]
コマンドを実行する前に、 GET_DDL 関数を呼び出してハイブリッドテーブルの定義を確認します。スキーマに同じ名前のテーブルやビューを含めることはできません。テーブルを作成する場合:
同じ名前のビューがスキーマにすでに存在する場合は、エラーが返され、テーブルは作成されません。
同じ名前のテーブルがスキーマに既に存在する場合、オプションの
OR REPLACE
キーワードがコマンドに含まれていない限り、エラーが返され、テーブルは作成されません。
重要
OR REPLACE
の使用は、既存のテーブルで DROP TABLE を使用してから、同じ名前で新しいテーブルを作成することと同じです。ドロップアクションと作成アクションは単一のアトミック操作で発生することに注意してください。これは、CREATE OR REPLACE TABLE 操作と同時に実行されるクエリが、古いテーブルバージョンまたは新しいテーブルバージョンのいずれかを使用することを意味します。
テーブルを再作成または交換すると、変更データがドロップされます。
予約キーワード と同様に、 ANSI 予約関数名(CURRENT_DATE、 CURRENT_TIMESTAMP など)は列名として使用できません。
CREATE HYBRID TABLE ...AS SELECT(CTAS):
SELECT リストの列名のエイリアスが有効な列である場合、 CTAS ステートメントでは列定義は不要です。省略した場合、列の名前と型は基になるクエリから推測されます。
CREATE HYBRID TABLE <table_name> AS SELECT ...
または、次の構文を使用して名前を明示的に指定できます。
CREATE HYBRID TABLE <table_name> ( <col1_name> , <col2_name> , ... ) AS SELECT ...
指定する列名の数は、クエリ内の SELECT リストアイテムの数と一致する必要があります。列のタイプは、クエリによって生成されたタイプから推測されます。
特定の順序で行を使用してテーブルを作成する場合は、 CTAS の SELECT 句で ORDER BY サブ句を使用します。
CTAS ステートメントからテーブルのスキーマを決定することもできますが、明示的にスキーマを指定することをお勧めします。
メタデータについて:
注意
Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。
インデックス:
一意制約、外部キー制約、またはインデックスを定義すると、作成時にインデックスをハイブリッドテーブルに定義できます。CREATE HYBRID TABLE コマンドは、
outoflineIndex
パラメーターの定義を許可することに注意してください。ハイブリッドテーブルのインデックス作成の詳細については、 CREATE INDEX をご参照ください。各記録のキーの基になるストレージエンジンに関連するスペースの制約のため、半構造化(バリアント、オブジェクト、配列)以外の列にのみインデックスを定義できます。
含まれる列を使用する¶
セカンダリインデックスに含まれる列を使用することは、列のセットが投影リストには存在するが、述語リストには存在しないようなクエリを頻繁に行う場合に特に有用です。例:
-- Create the employee table with a covering index
CREATE HYBRID TABLE employee (
employee_id INT PRIMARY KEY,
employee_name STRING,
employee_department STRING,
INDEX idx_department (employee_department) INCLUDE (employee_name)
);
-- Sample data insertion
INSERT INTO employee VALUES
(1, 'John Doe', 'Marketing'),
(2, 'Jane Smith', 'Sales'),
(3, 'Bob Johnson', 'Finance'),
(4, 'Alice Brown', 'Marketing');
-- Example Queries using covering index
SELECT employee_name FROM employee WHERE employee_department = 'Marketing';
SELECT employee_name FROM employee WHERE employee_department in ('Marketing', 'Sales');
この例では、 SELECT employee_name FROM employee WHERE employee_department = 'Marketing';
と SELECT employee_name FROM employee WHERE employee_department in ['Marketing','Sales'];
の両方のクエリは、ベーステーブルへのルックアップを回避することにより、カバリングインデックスの恩恵を受けます。しかし、インデックスに含まれる列を使用すると、追加の列がセカンダリインデックスに格納されるため、ストレージの消費量が増加する可能性があることに注意してください。
例¶
現在のデータベースで email
に一意制約、 full_name
にセカンダリインデックスを持つハイブリッドテーブルを作成します。
CREATE HYBRID TABLE mytable (
customer_id INT AUTOINCREMENT PRIMARY KEY,
full_name VARCHAR(255),
email VARCHAR(255) UNIQUE,
extended_customer_info VARIANT,
INDEX index_full_name (full_name)
);
+-------------------------------------+
| status |
|-------------------------------------|
| Table MYTABLE successfully created. |
+-------------------------------------+
前の例で作成したテーブルに行を挿入します。
INSERT INTO mytable (customer_id, full_name, email, extended_customer_info)
SELECT 100, 'Jane Doe', 'jdoe@gmail.com',
parse_json('{"address": "1234 Main St", "city": "San Francisco", "state": "CA", "zip":"94110"}');
+-------------------------+
| number of rows inserted |
|-------------------------|
| 1 |
+-------------------------+
主キーは一意にする必要があります。たとえば、前の例と同じ主キーを2回目に挿入しようとすると、次のエラーで失敗します。
200001 (22000): Primary key already exists
メールアドレスもインライン UNIQUE 制約に従う必要があります。たとえば、同じメールアドレスを持つ2つの記録を挿入しようとすると、ステートメントは次のエラーで失敗します。
Duplicate key value violates unique constraint "SYS_INDEX_MYTABLE_UNIQUE_EMAIL"
テーブルのプロパティとメタデータを表示します。 is_hybrid
列の値に注意してください。
SHOW TABLES LIKE 'mytable';
+-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------+
| created_on | name | database_name | schema_name | kind | is_hybrid | comment | cluster_by | rows | bytes | owner | retention_time | automatic_clustering | change_tracking | search_optimization | search_optimization_progress | search_optimization_bytes | is_external |
|-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------|
| 2022-02-23 23:53:19.707 +0000 | MYTABLE | MYDB | PUBLIC | TABLE | Y | | | NULL | NULL | MYROLE | 10 | OFF | OFF | OFF | NULL | NULL | N |
+-------------------------------+---------+---------------+-------------+-------+-----------+---------+------------+------+-------+--------+----------------+----------------------+-----------------+---------------------+------------------------------+---------------------------+-------------+
すべてのハイブリッドテーブルの詳細を表示します。
SHOW HYBRID TABLES;
+-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------+
| created_on | name | database_name | schema_name | owner | datastore_id | rows | bytes | comment |
|-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------|
| 2022-02-24 02:07:31.877 +0000 | MYTABLE | DEMO_DB | PUBLIC | ACCOUNTADMIN | 2002 | NULL | NULL | |
+-------------------------------+---------------------------+---------------+-------------+--------------+--------------+------+-------+---------+
テーブルの列に関する情報を表示します。
DESC TABLE mytable;
+-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type | kind | null? | default | primary key | unique key | check | expression | comment | policy name |
|-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| CUSTOMER_ID | NUMBER(38,0) | COLUMN | N | NULL | Y | N | NULL | NULL | NULL | NULL |
| FULL_NAME | VARCHAR(256) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
| APPLICATION_STATE | VARIANT | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | NULL |
+-------------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
テーブルからデータを選択します。
SELECT customer_id, full_name, email, extended_customer_info FROM mytable
WHERE extended_customer_info['state'] = 'CA';
+-------------+-----------+----------------+------------------------------+
| CUSTOMER_ID | FULL_NAME | EMAIL | EXTENDED_CUSTOMER_INFO |
|-------------+-----------+----------------+------------------------------|
| 100 | Jane Doe | jdoe@gmail.com | { |
| | | | "address": "1234 Main St", |
| | | | "city": "San Francisco", |
| | | | "state": "CA", |
| | | | "zip": "94110" |
| | | | } |
+-------------+-----------+----------------+------------------------------+