ストリームやタスクと比較した動的テーブル、およびマテリアライズド・ビュー¶
ストリームやタスクと同様に、動的テーブルはパイプラインでデータを変換する方法を提供します。
ストリームおよびタスクと比較した動的テーブル¶
動的テーブルはストリームやタスクと類似した目的を果たしますが、重要な違いがあります。
動的テーブルにストリームを作成する¶
動的テーブルをストリームのソースとして使用することは、通常のテーブルのストリームと同様ですが、以下の制限があります。
リフレッシュモード: ストリームは、 段階的 にリフレッシュされる動的テーブルでのみ作成できます。フルリフレッシュ動的テーブルは、リフレッシュのたびにテーブルを完全に書き換えるため、サポートされていません。
ストリーム型:動的テーブルは標準(delta)ストリームのみをサポートします。詳細については、 ストリームのタイプ をご参照ください。
次の例は、動的テーブルにストリームを作成する方法を示しています。
-- Create the dynamic table, for reference only CREATE OR REPLACE DYNAMIC TABLE product ...; -- Create the stream. CREATE OR REPLACE STREAM deltaStream ON DYNAMIC TABLE product; ストリームおよびタスクと動的テーブルの比較¶
キーの特徴 | ストリームおよびタスク | 動的テーブル |
|---|---|---|
データ変換 | タスクは命令型アプローチを使用します。手続き型コードを記述してベーステーブルからデータを変換します。 | 動的テーブルは宣言型アプローチを使用します。表示する結果を指定するクエリを記述し、クエリで使用されたベーステーブルからデータを取得して変換します。 インクリメンタルモードとフルリフレッシュモードで非決定性関数をサポート を除き、クエリに非決定論的関数を含めることはできません。 |
リフレッシュタイミング | データを変換するコードの実行スケジュールを定義します。 | 自動リフレッシュプロセスは、リフレッシュを実行するスケジュールを決定します。このプロセスは、指定された鮮度のターゲットレベル(ラグ)を満たすために、これらのリフレッシュをスケジュールします。 |
オーケストレーション | 手続きコードには、非決定性コード、ストアドプロシージャ、その他のタスクの呼び出しが含まれます。手続きコードには、 UDFs や外部関数の呼び出しを含めることができます。 | 動的テーブルの SELECT ステートメントには、結合、集計、ウィンドウ関数、その他の SQL 関数や構文を含めることができますが、ステートメントにストアドプロシージャやタスクの呼び出しを含めることはできません。現時点では、 SELECT ステートメントに外部関数の呼び出しを含めることはできません。 この制限は、動的テーブルのリフレッシュ方法によるものです。データをリフレッシュするために、自動プロセスは動的テーブルの SELECT ステートメントを分析し、データをリフレッシュする最適な方法を決定します。クエリの型によっては、自動プロセスではこれを判断できません。 SELECT ステートメントに関する制限の完全なリストについては、 インクリメンタルおよびフルリフレッシュモードでのクエリに対応 および 一般的な制限 をご参照ください。 |
データの鮮度 | タスクはストリームを使用して、ターゲットテーブルのデータを増分リフレッシュできます。これらのタスクを定期的に実行するようにスケジュールできます。 | 自動リフレッシュプロセスは、定期的に動的テーブルの増分リフレッシュを実行します。このプロセスは、指定したデータのターゲット「鮮度」に基づいてスケジュールを決定します。 |
例:ストリームとタスクと動的テーブル間のデータ変換の比較¶
ロードされた JSON データのスケジュールに従った変換 の例では、ストリームとタスクを使用して、ターゲットテーブル(names)に新しいデータを変換して挿入し、データをランディングテーブル(raw)にストリームしています。
次の例は、動的テーブルを使用して同じ変換を実行する方法を示しています。動的テーブルを作成する際には、表示する結果のクエリを指定します。データの増分リフレッシュでは、変更を追跡するストリームを作成し、それらの変更を調べてターゲットテーブルに変更を適用するタスクを記述する必要はありません。自動リフレッシュプロセスは、指定したクエリに基づいて代わりこれを実行します。
ストリームおよびタスクの SQL ステートメント | 動的テーブルの SQL ステートメント |
|---|---|
-- Create a landing table to store -- raw JSON data. CREATE OR REPLACE TABLE raw (var VARIANT); -- Create a stream to capture inserts -- to the landing table. CREATE OR REPLACE STREAM rawstream1 ON TABLE raw; -- Create a table that stores the -- names of office visitors from the -- raw data. CREATE OR REPLACE TABLE names (id INT, first_name STRING, last_name STRING); -- Create a task that inserts new name -- records from the rawstream1 stream -- into the names table. -- Execute the task every minute when -- the stream contains records. CREATE OR REPLACE TASK raw_to_names WAREHOUSE = mywh SCHEDULE = '1 minute' WHEN SYSTEM$STREAM_HAS_DATA('rawstream1') AS MERGE INTO names n USING ( SELECT var:id id, var:fname fname, var:lname lname, metadata$action, metadata$isupdate FROM rawstream1 ) r1 ON n.id = TO_NUMBER(r1.id) WHEN MATCHED AND metadata$action = 'DELETE' AND NOT metadata$isupdate THEN DELETE WHEN MATCHED AND metadata$action = 'INSERT' THEN UPDATE SET n.first_name = r1.fname, n.last_name = r1.lname WHEN NOT MATCHED AND metadata$action = 'INSERT' THEN INSERT (id, first_name, last_name) VALUES (r1.id, r1.fname, r1.lname); -- Start the task ALTER TASK raw_to_names RESUME; | -- Create a landing table to store -- raw JSON data. CREATE OR REPLACE TABLE raw (var VARIANT); -- Create a dynamic table containing the -- names of office visitors from -- the raw data. -- Try to keep the data up to date within -- 1 minute of real time. CREATE OR REPLACE DYNAMIC TABLE names TARGET_LAG = '1 minute' WAREHOUSE = mywh AS SELECT var:id::int id, var:fname::string first_name, var:lname::string last_name FROM raw; |
動的テーブルとマテリアライズドビューの比較¶
動的テーブルとマテリアライズドビューは、どちらもクエリの結果を 具体化 する点で類似しています。しかし、重要な違いがあります。
キーの特徴 | マテリアライズドビュー | 動的テーブル |
|---|---|---|
クエリのパフォーマンス | マテリアライズドビューは、クエリパフォーマンスを透過的に向上させるように設計されています。 たとえば、ベーステーブルをクエリする場合、Snowflakeのクエリオプティマイザーはクエリを 自動的 に書き換えて、代わりにマテリアライズドビューをクエリすることができます。 | 動的テーブルは、マルチレベルのデータパイプラインを構築するために設計されています。 動的テーブルはクエリパフォーマンスを向上させますが、Snowflakeのクエリオプティマイザーは、動的テーブルを使用するようにクエリを 自動的に書き換えることはありません。クエリで動的テーブルを指定した場合にのみ、動的テーブルがクエリで使用されます。 |
クエリの複雑さ | マテリアライズドビューは単一のベーステーブルのみを使用できます。マテリアライズドビューは、複雑なクエリ(つまり、結合やネストされたビューを含むクエリ)に基づくことはできません。 | 動的テーブルは、結合や和集合を含んでいる、複雑なクエリに基づくことができます。 |
データの鮮度 | マテリアライズドビューを介してアクセスされるデータは、 常に最新 です。DML 操作によってベーステーブルのデータが変更される場合、Snowflakeはマテリアライズドビューを更新するか、ベーステーブルから更新されたデータを使用します。 | データは、動的テーブルのターゲットラグタイムまで最新です。 リフレッシュロジックを含む、動的テーブルのメンテナンスとリフレッシュは、リフレッシュのためのコンピューティングと合わせて、別のコンピューティングサービスによって自動的に管理されます。通常は追加の費用が必要です。詳細については、 動的テーブルのコストを理解する をご参照ください。 |