不変性制約の使用¶
動的テーブルの特定の行が変更されないことをSnowflakeに指示するには、 CREATE DYNAMIC TABLE の IMMUTABLE WHERE 句または ALTER DYNAMIC TABLE ステートメントを使用します。
不変性は、変更されない行をスキップすることでリフレッシュを高速化します。不変性のある バックフィル は、即時および継続的なパフォーマンス上のメリットを提供します。
初期作成 :バックフィルは、計算コストなしで履歴データを即座にコピーします。これにより、何年もの履歴データを含むテーブルが、コストのかかる初期リフレッシュを必要とせずにすぐに利用できるようになります。
継続的な更新 :不変性制約は、将来のリフレッシュ時にバックフィルされたデータを再処理から保護します。可変リージョンのみがリフレッシュされ、テーブルが大きくになってもリフレッシュ時間を高速化します。
概念的な背景については、 不変性制約の理解 をご参照ください。
基本的な例¶
例:ディメンションテーブルが変更された場合の再計算を防止する¶
ディメンションテーブルの行を更新すると、可変期間のファクトのみが再処理されます。
例:ソーステーブルよりも長いデータを保持する¶
ステージングテーブルよりも長い解析済みデータを保持する動的テーブルを作成し、タスクで古いステージングデータを削除します。
例:下流のテーブルがフルリフレッシュテーブルからインクリメンタルリフレッシュを使用できるようにする¶
一部のクエリ構成(Pythonユーザー定義テーブル関数など)には、フルリフレッシュモードが必要です。不変性制約により、下流のテーブルは引き続きインクリメンタルリフレッシュを使用できます。
バックフィルの例¶
以下の例では、バックフィルされたデータを持つテーブルから新しい動的テーブルを作成する方法を示します。
バックフィルテーブルには、動的テーブルと同じ順序で、互換性のあるデータ型の一致する列が含まれている必要があります。Snowflakeはバックフィルテーブルからテーブルプロパティや権限をコピーしません。
Time Travelパラメーター AT | BEFORE を指定した場合、Snowflakeは指定した時間にバックフィルテーブルからデータをコピーします。
不変性制約 とバックフィルデータで作業する場合、以下の制限が適用されます。
現在、バックフィルに使用できるのは通常のテーブルと動的テーブルのみです。
ポリシーやタグはバックフィルテーブルからコピーされるため、新しい動的テーブルでは指定できません。
新しい動的テーブルとバックフィルテーブルのクラスタリングキーは同じである必要があります。
例:テーブルの一部からのバックフィル¶
次の例では、my_backfill_table から my_dynamic_table の不変リージョンを、さらに動的テーブルの定義から可変リージョンをバックフィルします。
この動的テーブルを再初期化する場合:
インクリメンタルリフレッシュモード :Snowflakeはすべての可変行を削除し、可変リージョンのみを再入力します。
フルリフレッシュモード :Snowflakeは、同じ効果でフルリフレッシュを実行します。
例:バックフィルを使用して、動的テーブルのデータを回復または変更する¶
動的テーブルのデータや定義を直接編集することはできません。データを回復または修正するには、次の回避策の手順を完了します。
動的テーブルを通常のテーブルにクローンします。
必要に応じて、クローンされたテーブルを変更します。
編集されたテーブルから新しい動的テーブルにバックフィルします。
次の例では my_dynamic_table が sales ベーステーブルから日次販売データを集計します。
オプションで、古いデータをアーカイブしてストレージコストを節約できます。
その後、2025-05-01 で販売エラーを見つけます。条件: sales_count は2である必要があります。これを修正するには
my_dynamic_tableを通常のテーブルにクローンします。クローンされたテーブルを更新します。
編集されたクローンをバックフィルのソースとして使用し、動的テーブルを再作成します。
この手法により、ベーステーブルを変更することなく、動的テーブルのデータを回復または修正できます。
例:バックフィルを使用して動的テーブルのスキーマを変更する¶
動的テーブルのスキーマを直接変更することはできません。スキーマを更新する場合(たとえば、列を追加するなど)は、次のステップに従います。
動的テーブルを通常のテーブルにクローンします。次の例では、
sales`(:ref:`前述の <label-data-surgery-example>)から作成したmy_dynamic_tableを使用します。クローンされたテーブルのスキーマを変更します。
オプションで、新しい列にデータを追加します。
編集されたクローンをバックフィルのソースとして使用し、動的テーブルを再作成します。
新しい列が動的テーブルに表示されることを確認します。
不変性ステータスを確認¶
動的テーブルで行が可変かどうかを確認するには、 METADATA$IS_IMMUTABLE 列をクエリします。
動的テーブルの不変性制約を表示するには、 SHOW DYNAMIC TABLES を実行し、 immutable_where 列を確認します。