CREATE INTERACTIVE TABLE¶
Creates a new interactive table in the current/specified schema or replaces an existing table. Interactive tables are optimized for low-latency, interactive queries and provide the best performance when queried using interactive warehouses.
インタラクティブテーブルは、サポートする SQL 操作が標準のテーブルよりも限定されています。また、ダッシュボードやデータ駆動型 APIs など、同時実行性の高いリアルタイムクエリワークロード用に設計されています。
注釈
インタラクティブテーブルを作成するときは、最も時間的制約のあるクエリの WHERE 句で使用される1つ以上の列に対する CLUSTER BY 句を定義する必要があります。
次の CREATE INTERACTIVE TABLE バリアントを使用することもできます。
バリアント構文:静的インタラクティブテーブル (クエリから入力された静的インタラクティブテーブルを作成)
バリアント構文:動的インタラクティブテーブル (自動更新付きの動的インタラクティブテーブルを作成)
標準的なSnowflakeテーブルに使用される完全な CREATE TABLE 構文については、 CREATE TABLE をご参照ください。
Tip
インタラクティブテーブルを作成して使用する前に、 制限事項とユースケース についてよく理解しておく必要があります。インタラクティブテーブルは、選択的 WHERE 句を含むシンプルな SELECT ステートメントで最適に機能します。
- こちらもご参照ください。
CREATE WAREHOUSE、 ALTER WAREHOUSE、 SHOW TABLES、 SHOW WAREHOUSES、 DROP TABLE
構文¶
CREATE [ OR REPLACE ] INTERACTIVE TABLE [ IF NOT EXISTS ] <table_name>
(
<col_name> <col_type>
[ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col_name> , <cond_col1> , ... ) ] ]
[ , <col_name> <col_type> [ ... ] ]
)
CLUSTER BY ( <expr> [ , <expr> , ... ] )
[ TARGET_LAG = '<num> { seconds | minutes | hours | days }' ]
[ WAREHOUSE = <warehouse_name> ]
[ COPY GRANTS ]
[ COMMENT = '<string_literal>' ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
[ [ WITH ] AGGREGATION POLICY <policy_name> [ ENTITY KEY ( <col_name> [ , <col_name> ... ] ) ] ]
[ [ WITH ] JOIN POLICY <policy_name> [ ALLOWED JOIN KEYS ( <col_name> [ , ... ] ) ] ]
[ [ WITH ] STORAGE LIFECYCLE POLICY <policy_name> ON ( <col_name> [ , <col_name> ... ] ) ]
AS <query>
必須パラメーター¶
table_nameインタラクティブテーブルの識別子(つまり、名前)を指定します。テーブルが作成されるスキーマに対して一意である必要があります。
また、識別子はアルファベット文字で始まる必要があり、識別子文字列全体が二重引用符で囲まれている場合を除き、スペースや特殊文字を含めることはできません(例:
"My object")。二重引用符で囲まれた識別子も大文字と小文字が区別されます。詳細については、 識別子の要件 をご参照ください。
CLUSTER BY ( expr [ , expr , ... ] )Specifies one or more columns or column expressions in the table as the clustering key. Choose clustering columns that are used in the WHERE clauses of your most time-critical queries, as this significantly affects query performance.
有効なクラスタリングキーの選択の詳細については、 クラスタリングキーとクラスタ化されたテーブル をご参照ください。
AS querySpecifies the SELECT statement that populates the interactive table. This query must be specified last in the CREATE INTERACTIVE TABLE statement, regardless of other parameters included.
クエリは、CREATE TABLE AS SELECT(CTAS)パターンに従い、インタラクティブテーブルのデータとスキーマを定義します。
col_nameSpecifies the column identifier (i.e. name). Column identifiers must start with an alphabetic character and cannot contain spaces or special characters unless the entire identifier string is enclosed in double quotes.
詳細については、 識別子の要件 をご参照ください。
col_type列のデータ型を指定します。
テーブル列に指定できるデータ型の詳細については、 SQL データ型リファレンス をご参照ください。
オプションのパラメーター¶
MASKING POLICY policy_name列に設定する マスキングポリシー を指定します。
USING ( col_name , cond_col_1 ... )条件付きマスキングポリシー SQL 式に渡す引数を指定します。
リストの最初の列は、データをマスクまたはトークン化するポリシー条件の列を指定し、マスキングポリシーが設定されている列と一致する 必要 があります。
追加の列は、最初の列でクエリが実行されたときに、クエリ結果の各行のデータをマスクするかトークン化するかを決定するために評価する列を指定します。
USING 句が省略されている場合、Snowflakeは条件付きマスキングポリシーを通常の マスキングポリシー として扱います。
OR REPLACEスキーマに既にインタラクティブテーブルがある場合、それを置き換えることを指定します。これは、既存のテーブルで DROP TABLE を使用してから、同じ名前で新しいテーブルを作成することと同じです。
IF NOT EXISTSスキーマにインタラクティブテーブルがまだ存在しない場合にのみ作成するように指定します。同じ名前のテーブルが既に存在する場合、ステートメントは新しいテーブルを作成せずに成功します。
注釈
OR REPLACE 句と IF NOT EXISTS 句は相互に排他的であり、同じステートメントで両方を使用することはできません。
TARGET_LAG = 'num { seconds | minutes | hours | days }'インタラクティブテーブルの自動更新の最大ラグタイムを指定します。指定すると、インタラクティブテーブルは動的インタラクティブテーブルになり、ソースデータの指定されたラグタイム内にとどまるように自動的にリフレッシュされます。
最小値は60秒(1分)です。
単位が指定されていない場合、数値は秒を表します。
TARGET_LAG が指定されていない場合、テーブルは静的インタラクティブテーブルとして作成されます。
TARGET_LAG を指定する場合は、WAREHOUSE パラメーターも必要です。
WAREHOUSE = warehouse_nameTARGET_LAG が指定されている場合に必須です。 TARGET_LAG が設定されている場合にリフレッシュ操作に使用される標準ウェアハウスを指定します。これはインタラクティブウェアハウスではなく、標準ウェアハウスである必要があります。
COPY GRANTSCREATE OR REPLACE INTERACTIVE TABLE を使用してインタラクティブテーブルを置き換えるときに、元のテーブルからのアクセス権限を保持することを指定します
このパラメーターは、既存のテーブルから新しいテーブルに OWNERSHIP を除くすべての権限をコピーします。デフォルトでは、 CREATE INTERACTIVE TABLE ステートメントを実行するロールが新しいテーブルを所有します。
COMMENT = 'string_literal'インタラクティブテーブルのコメントを指定します。
ROW ACCESS POLICY policy_name ON ( col_name [ , col_name ... ] )テーブルに設定する 行アクセスポリシー を指定します。
このパラメーターは、 CREATE OR ALTER バリアント構文ではサポートされていません。
AGGREGATION POLICY policy_name [ ENTITY KEY ( col_name [ , col_name ... ] ) ]テーブルに設定する 集計ポリシー を指定します。テーブルに1つ以上の集計ポリシーを適用できます。
オプションの ENTITY KEY パラメーターを使用して、テーブル内でエンティティを一意に識別する列を定義します。詳細については、 集計ポリシーによるエンティティレベルのプライバシーの実装 をご参照ください。集計ポリシーには、1つ以上のエンティティキーを指定できます。
JOIN POLICY policy_name [ ALLOWED JOIN KEYS ( col_name [ , ... ] ) ]テーブルに設定する 結合ポリシー を指定します。
オプションの ALLOWED JOIN KEYS パラメーターを使用して、このポリシーが有効な場合に結合列として使用できる列を定義します。詳細については、 結合ポリシー をご参照ください。
このパラメーターは、 CREATE OR ALTER バリアント構文ではサポートされていません。
STORAGE LIFECYCLE POLICY policy_name ON ( col_name [ , col_name ... ] )テーブルに添付する ストレージライフサイクルポリシー を指定します。
ON 句で指定された列は、ポリシー関数署名で定義された引数の数およびデータ型と一致する必要があります。Snowflakeはこれらの列を使用して、ポリシー式を評価し、アーカイブまたは期限切れにする行を決定します。
重要
アーカイブストレージポリシーをテーブルに添付すると、そのテーブルは、有効期間中、指定されたアーカイブティアに永続的に割り当てられます。新しいポリシーを適用してアーカイブティアを変更することはできません。たとえば、 ALTERTABLE...DROPSTORAGELIFECYCLEPOLICY 内の COOL のアーカイブティアで作成されたポリシーは指定できません。その後、テーブルを変更して、 COLD アーカイブティアで作成されたポリシーを追加します。テーブルのアーカイブティアを変更するには、Snowflakeサポートに連絡し、現在アーカイブされているデータの削除をリクエストしてください。その他の留意点については、 アーカイブストレージポリシー をご参照ください。
ストレージライフサイクルポリシーの作成と管理の詳細については、 Create and manage storage lifecycle policies をご参照ください。
このパラメーターは、 CREATE OR ALTER バリアント構文ではサポートされていません。
アクセス制御の要件¶
この操作の実行に使用される ロール には、少なくとも次の 権限 が必要です。
権限 |
オブジェクト |
メモ |
|---|---|---|
CREATE INTERACTIVE TABLE |
スキーマ |
スキーマにインタラクティブテーブルを作成するために必要です。 |
SELECT |
テーブル、外部テーブル、ビュー |
AS SELECT 句でクエリされるテーブルやビューについて必要です。 |
APPLY |
マスキングポリシー、行アクセスポリシー、タグ、ストレージライフサイクルポリシー |
テーブルの作成時に、マスキングポリシー、行アクセスポリシー、オブジェクトタグ、ストレージライフサイクルポリシー、またはこうした ガバナンス 機能の任意の組み合わせを適用する場合にのみ必要です。 |
USAGE |
データベース、スキーマ |
インタラクティブテーブルを含むデータベースとスキーマについて必要です。 |
USAGE |
ウェアハウス |
WAREHOUSE パラメーターで指定されたウェアハウスについて必要です(TARGET_LAG を使用する場合)。 |
指定された権限のセットを使用してカスタムロールを作成する手順については、 カスタムロールの作成 をご参照ください。
セキュリティ保護可能なオブジェクト に対して SQL アクションを実行するためのロールと権限付与に関する一般的な情報については、 アクセス制御の概要 をご参照ください。
使用上の注意¶
インタラクティブテーブルは、インタラクティブウェアハウスではなく、標準ウェアハウスを使用して作成する必要があります。
CLUSTER BY 句はすべてのインタラクティブテーブルについて必要であり、クエリのパフォーマンスに大きな影響を与えます。最も一般的な WHERE 句パターンに基づいて、クラスタリング列を慎重に選択します。
インタラクティブテーブルは、インタラクティブウェアハウス通じてクエリするときに最高のパフォーマンスを提供します。インタラクティブテーブルのパフォーマンスを最適化するには、次を実行します。
インタラクティブウェアハウスを作成します
ALTER WAREHOUSE ... ADD TABLES を使用して、インタラクティブテーブルをインタラクティブウェアハウスに関連付けます
インタラクティブウェアハウスを再開します
インタラクティブウェアハウスを使用してインタラクティブテーブルをクエリします
インタラクティブテーブルでサポートする SQL 操作のセットは、標準テーブルと比較して、限定されています。
WHERE 句を含む SELECT ステートメントは最適化されています。
シンプルな GROUP BY 操作はサポートされています。
DML 操作(INSERT、UPDATE、DELETE)はサポートされていません。DML 操作は INSERT OVERWRITE のみが許可されています。
複雑なクエリ操作は、パフォーマンスの向上が限定される場合があります。
動的インタラクティブテーブル(TARGET_LAG を使用)は、指定された標準ウェアハウスを使用して自動的に更新されます。ラグタイムは、データの鮮度とコンピューティングコストのバランスを取ります。
Static interactive tables don't automatically refresh. They require manual updates to reflect changes in source data. To do so, run a CREATE OR REPLACE command or an INSERT OVERWRITE command on the interactive table.
テーブルの列構造がポリシーで指定された列と一致する場合は、条件付き列を使用する単一のマスキングポリシーを複数のテーブルに適用できます。
1つ以上のテーブル列にマスキングポリシーを使用してテーブルを作成する場合、またはテーブルに行アクセスポリシーを追加する場合は、 POLICY_CONTEXT 関数を使用して、マスキングポリシーによって保護されている列と行アクセスポリシーによって保護されているテーブルに対するクエリをシミュレートします。
インタラクティブテーブルには、クエリを高速化するために追加のメタデータとインデックス情報が格納されますが、これは圧縮されているため、ストレージサイズへの影響は最小限に抑えられます。
メタデータについて:
注意
Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。
WITH STORAGE LIFECYCLE POLICY 句でテーブルを作成する場合:
ポリシーを適用するために必要な権限を持っている必要があります。必要な権限については、 Storage lifecycle policy privileges をご参照ください。
テーブルには、ストレージライフサイクルポリシーを1つだけ添付できます。
列の数はポリシー関数署名の引数の数と一致する必要があり、列データは引数の型に対応する必要があります。
テーブル列の名前を変更しても、関連付けられたポリシーは影響を受けません。Snowflakeは列 IDs を使用してポリシーをテーブルに関連付けます。
ストレージライフサイクルポリシー式を評価して適用するために、Snowflakeは内部的および一時的にテーブルに対するガバナンスポリシーをバイパスします。
バリアント構文:静的インタラクティブテーブル¶
ソースクエリから一度だけ入力される、静的インタラクティブテーブルを作成します。
CREATE [ OR REPLACE ] INTERACTIVE TABLE <table_name>
CLUSTER BY ( <expr> [ , <expr> , ... ] )
[ COPY GRANTS ]
[ COMMENT = '<string_literal>' ]
AS <query>
Static interactive tables don't automatically refresh. They require manual updates to reflect changes in source data. To do so, run a CREATE OR REPLACE command or an INSERT OVERWRITE command on the interactive table.
バリアント構文:動的インタラクティブテーブル¶
指定されたラグタイムに基づいて自動的にリフレッシュされる動的インタラクティブテーブルを作成します。
CREATE [ OR REPLACE ] INTERACTIVE TABLE <table_name>
CLUSTER BY ( <expr> [ , <expr> , ... ] )
TARGET_LAG = '<num> { seconds | minutes | hours | days }'
WAREHOUSE = <warehouse_name>
[ COPY GRANTS ]
[ COMMENT = '<string_literal>' ]
AS <query>
動的インタラクティブテーブルは、リフレッシュ操作のために指定された標準ウェアハウスを使用して、ソースデータの指定された TARGET_LAG 内に収まるように自動的にリフレッシュされます。
例¶
次の例は、インタラクティブテーブルを作成するさまざまな方法と、データのソースの指定およびデータの更新方法を示します。
基本的な静的インタラクティブテーブル¶
既存の注文データから静的インタラクティブテーブルを作成し、最適なクエリパフォーマンスのためにカスタマーと日付でクラスタリングします。
CREATE INTERACTIVE TABLE orders_interactive
CLUSTER BY (customer_id, order_date)
COMMENT = 'Interactive table for real-time order analytics'
AS
SELECT customer_id, order_date, product_id, quantity, total_amount
FROM orders_staging
WHERE order_date >= '2024-01-01';
自動更新付きの動的インタラクティブテーブル¶
ほぼリアルタイムの売上概要を提供するために、5分ごとにリフレッシュする動的インタラクティブテーブルを作成します。
CREATE INTERACTIVE TABLE sales_summary_interactive
CLUSTER BY (region, product_category)
TARGET_LAG = '5 minutes'
WAREHOUSE = refresh_warehouse
COMMENT = 'Real-time sales dashboard data'
AS
SELECT
region,
product_category,
SUM(sales_amount) as total_sales,
COUNT(*) as transaction_count,
AVG(sales_amount) as avg_sale
FROM sales_data
GROUP BY region, product_category;
複雑なクエリのための複数列クラスタリング¶
さまざまなクエリパターン用に最適化された複数列のクラスタリングを持つインタラクティブテーブルを作成します。
CREATE INTERACTIVE TABLE customer_analytics_interactive
CLUSTER BY (customer_tier, region, signup_date)
TARGET_LAG = '10 minutes'
WAREHOUSE = analytics_warehouse
AS
SELECT
customer_id,
customer_tier,
region,
signup_date,
total_orders,
lifetime_value,
last_order_date
FROM customer_metrics
WHERE customer_tier IN ('GOLD', 'PLATINUM', 'DIAMOND');
既存のインタラクティブテーブルの置き換え¶
既存のインタラクティブテーブルを更新されたクラスタリングとリフレッシュ設定に置き換えます。
CREATE OR REPLACE INTERACTIVE TABLE product_performance_interactive
CLUSTER BY (category, brand, launch_date)
TARGET_LAG = '2 minutes'
WAREHOUSE = fast_refresh_warehouse
COPY GRANTS
AS
SELECT
product_id,
category,
brand,
launch_date,
units_sold,
revenue,
customer_rating
FROM product_sales_view
WHERE launch_date >= DATEADD('month', -6, CURRENT_DATE());