不変性制約の理解¶
不変性制約を使用すると、動的テーブルの一部を静的としてマークできます。不変性制約を定義すると、Snowflakeはリフレッシュ時にそれらの行をスキップします。これにより、特に大量の履歴データを含むテーブルのパフォーマンスが向上します。
動的テーブルを作成または変更するときは IMMUTABLE WHERE 句で不変性制約を定義します。句は、どの行が不変であるかを識別する条件または述語を指定します。
主な動作:
初期更新 :IMMUTABLE WHERE述語は、最初の更新中に無視されますが、後続のすべての更新には適用されます。
フルリフレッシュモード :述語により、条件に一致しない行のみに再計算が制限されます。
インクリメンタルリフレッシュ :ストリームとインクリメンタルリフレッシュの動的テーブルは、不変性制約を持つフルリフレッシュの動的テーブルから読み取ることができます。
クローニングと複製 :Snowflake が制限のないIMMUTABLE WHERE制約をコピーします
コンピューティングコストについては、 不変性制約のコンピューティングコスト をご参照ください。
不変性制約を使用する場合¶
不変性制約は、次のシナリオで役立ちます。
- 履歴データの再処理を回避する
動的テーブルに再処理したくない履歴データが含まれている場合は、古い行を不変としてマークします。
- フルリフレッシュモードの最適化
フル リフレッシュモード を使用する動的テーブルは通常、リフレッシュごとにすべての行を再計算します。不変性制約により、可変行のみに再計算が制限され、ほとんどのデータが履歴である場合の作業が大幅に削減されます。
- インクリメンタル下流リフレッシュを促進する
Pythonユーザー定義のテーブル関数などの一部のクエリ構成では、動的テーブルをフルリフレッシュモードで使用する必要があります。通常は、これにより下流のテーブルがインクリメンタルリフレッシュの恩恵を受けられなくなります。上流のテーブルに不変性制約がある場合でも、下流のテーブルはインクリメンタル処理の恩恵を受けることができます。
不変性でバックフィルを使用する¶
バックフィルは、不変性制約を拡張します。バックフィルは、既存のデータを再計算することなく動的テーブルに即座にコピーできるゼロコピー操作です。既存のパイプラインを移行したり、動的テーブル定義を変更したり、何年もの履歴データでテーブルを作成する際にコストがかかる初期化を回避したりするために使用します。
バックフィルされたデータは、将来のリフレッシュ中に変更されることはありません。
IMMUTABLE WHERE および BACKFILL FROM の両方で動的テーブルを作成する場合:
バックフィルは、ソーステーブルから 不変領域 をコピーします。不変領域は、
IMMUTABLE WHERE条件に一致する行で構成されます。クエリ定義は、 不変領域 を計算します。可変リージョンは、条件に一致しない行で構成されます。
主キー制約および一意制約(RELY)との相互作用¶
動的テーブルは、:ref:`RELYプロパティ<label-join-elimination-setting-rely>`が設定された:doc:`主キーおよび一意制約</sql-reference/constraints-overview>`を持つことができます。ただし、動的テーブルにおいて以下の両方が真である場合のみサポートされます。
``IMMUTABLE WHERE``述語がセットされている。
少なくとも1つの主キーまたは一意制約にRELYプロパティが設定されている。
このとき、``IMMUTABLE WHERE``述語で参照される列は、そのテーブル上のすべてのRELY主キーおよびRELY一意制約のセットで参照される列のサブセットである必要があります。制約が存在する場合、許可済みの列のセットには、RELYプロパティを持つ制約のみが含まれます。次の例を検討してください。
テーブルの``A``列にRELY主キーがあり、``B``列にNORELY一意制約がある場合、``IMMUTABLE WHERE``述語は``A``列(またはRELY制約列のサブセット)のみを参照できます。
テーブルの``A``列にRELY主キー、
B``列にRELY一意制約、``C``列にNORELY一意制約がある場合、``IMMUTABLE WHERE``述語は``A``および``B、またはこれらの任意のサブセットのみを参照できます。
RELY制約あるいは``IMMUTABLE WHERE``述語を追加したり変更したりする際、有効性が確認されます。変更によりルール違反が生じる場合(例えば、RELY制約に含まれない列を述語が参照する場合など)、ステートメントはエラーとなり失敗します。