リフレッシュモードが動的テーブルのパフォーマンスに与える影響¶
動的テーブルの実際の リフレッシュモード は作成時に決定され、その後は不変です。明示的に指定されない場合、リフレッシュモードのデフォルトは AUTO
です。これは、クエリの複雑さ、サポートされていない構成要素、演算子、関数などの様々な要因に基づいてリフレッシュモードを選択します。
動的テーブルのリフレッシュモードを確認するには、 動的テーブルリフレッシュモードを表示する をご参照ください。
Tip
あなたのユースケースに最適なモードを決定するために、自動推奨と具体的なリフレッシュモード(フルとインクリメンタル)を試してみてください。動的テーブルのパフォーマンスに最適なモードは、データ変更量とクエリの複雑さによって異なります。さらに、専用のウェアハウスでさまざまなリフレッシュモードをテストすることで、コストを分離し、実際のワークロードに基づいてパフォーマンスチューニングを改善することができます。
Snowflakeリリース間で一貫性のある動作を実現するには、すべてのプロダクションテーブルで明示的にリフレッシュモードを設定します。 AUTO
の動作はSnowflakeのリリース間で変更される可能性があり、プロダクションパイプラインで使用した場合、予期しないパフォーマンスの変化を引き起こす可能性があります。
詳細については、 パフォーマンス最適化のベストプラクティス をご参照ください。
フルリフレッシュモードのパフォーマンス¶
フルリフレッシュはクエリを実行し、その結果で動的テーブルを上書きします。動的テーブルの内容は、フルリフレッシュモードと増分リフレッシュモードのどちらを選んでも同じです。
フルリフレッシュは通常、複雑なクエリや、インクリメンタルリフレッシュでは効率が悪いワークロードに使用されます。
フルリフレッシュはリソースを大量に消費しますが、 サポートされていないインクリメンタル・オペレーション やデータの大幅な変更など、データセット全体の再処理が必要な場合に有効です。
フルリフレッシュのパフォーマンスを最適化するには、 他のSnowflakeクエリ と同様に扱いますが、コストにはクエリの実行だけでなく、クエリの実行と結果の挿入の両方が含まれることを忘れないでください。
増分リフレッシュモードパフォーマンス¶
インクリメンタルリフレッシュは、前回のリフレッシュ以降の変更を適用することに重点を置き、小さな更新を伴う大規模なデータセットに対してより効率的です。動的テーブルの内容は、選択されたリフレッシュモードに関係なく同じです。
しかし、インクリメンタルリフレッシュは、未変更データの再処理をスキップするため、よりリソース効率が高くなります。インクリメンタルリフレッシュを使用するかどうかは、変更の量や複雑さといったワークロードの特性や、速度やリソースの節約といった潜在的なパフォーマンスの向上によって決まります。
以下のセクションでは、増分リフレッシュに適したワークロードの定義について説明します。ワークロードがこれらのセクションで説明した条件に当てはまらない場合は、フルリフレッシュモードを使用すると効率が向上する可能性があります。
インクリメンタルリフレッシュのパフォーマンスの最適化については、 増分リフレッシュパフォーマンス を参照してください。
注釈
このドキュメントに記載されている推奨事項は、増分リフレッシュクエリのサポートやパフォーマンスの改善に伴い、時間の経過とともに変更される可能性があります。
増分リフレッシュパフォーマンスの理解¶
増分リフレッシュでは、通常、ほとんどの労力は動的テーブルの変更を計算することに費やされます。これはクエリによって異なり、非常に複雑になることがあります。よくある誤解は、増分リフレッシュはソーステーブルの変更のみをスキャンするのであって、ソーステーブルそのものをスキャンするのではないということです。これは、増分リフレッシュは変更されたソースデータの量に比例した作業のみを行うべきだという誤解を招きかねませんが、そうではありません。実際には、増分リフレッシュはソーステーブルを直接スキャンする必要があります。
例えば、テーブルAとテーブルBの間に内部結合を行うクエリがあるとします。テーブルAに行が挿入されると、クエリの変更を計算するためにテーブルBと結合する必要があります。このAの1行がBの多くの行と結合する可能性があるため、ソースの変更が少なかったとしても、多くの作業が発生する可能性があります。
このような余分な作業は、様々な演算子で発生する可能性があります。増分リフレッシュは、新しいデータを処理し、すでに行われた作業をスキップします。特に複雑なクエリでは、何をスキップするかを決定するのに追加作業が必要になることがあり、 異なる演算子は、異なる方法で作業をスキップすることができます。
通常、変更のサイズと局所性は、どの程度作業をスキップできるかに影響します。
サイズが増分リフレッシュのパフォーマンスに与える影響¶
増分リフレッシュのパフォーマンスに影響を与える最も重要な要因は、ソースデータの変更サイズです。動的なテーブルリフレッシュの変更サイズを決定する際には、コピーされた行もカウントするようにしてください。マイクロパーティション内のいくつかの行を変更するDMLも、そのマイクロパーティション内の変更されていない行を新しいマイクロパーティションにコピーします。
ベーステーブルで、変更された行の数を分析するには、ベーステーブル上で最後のリフレッシュ時に ストリームを作成 し、 SYSTEM$STREAM_BACKLOG を使用します。例:
CREATE STREAM mystream ON TABLE mybasetable BEFORE(STATEMENT => 'last refresh UUID');
SELECT * FROM SYSTEM$STREAM_BACKLOG('mystream');
極端な例として、ソースからすべてのデータを削除した場合の影響を考えてみましょう。フルリフレッシュでは空のテーブルが表示されるだけで、非常に短時間で処理できます。一方、増分リフレッシュでは、削除された行をすべて処理しなければならず、処理速度が大幅に低下します。
同様の減速は、それほど極端でないケースでも発生します。良好なワークロードのガイドラインは、ソースまたはターゲットの変更を行の5%未満に抑えることです。
局所性が増分リフレッシュのパフォーマンスに与える影響¶
増分リフレッシュに影響を与える2番目に重要な要因は、 局所性 です。これは、異なるディメンションに沿って、データやアクションがどれだけ密接に関連しているかを意味します。
例えば、タイムスタンプ列を持つテーブルがあり、常にその列に現在時刻を持つ行を挿入する場合、ワークロードは挿入順序とタイムスタンプ列の間に強い局所性を持ちます。
局所性は様々な形で現れますが、増分リフレッシュにとって特に重要なものがいくつかあります。以下の3つのカテゴリーすべてで強力な局所性を確保できるとは限りませんが、いずれかの分野で局所性を向上させると、増分リフレッシュのパフォーマンスが向上します。
局所性エリア |
説明 |
---|---|
クラスタリングキーとパーティショニングキーの間の局所性。 |
動的テーブル定義でパーティショニング操作を行う場合、基礎となるソースがこれらのパーティショニングキーに基づいてクラスタリングされていると便利です。 例えば、IDを使用して2つのテーブルを結合する場合、テーブルがそれぞれのID列によってクラスタリングされている方が、増分リフレッシュのパフォーマンスが向上します。 |
パーティショニングまたはグループ化されたキーとソースの変更の間の局所性。 |
理想的には、ソースへの変更は、ソーステーブルのごく一部の行とパーティショニングキーのみを共通にする必要があります。 例えば、現在のタイムスタンプで行を挿入する場合、キーとソースの変更の間に強い局所性があるため、時間別にグループ化するとうまくいきます。しかし、テーブル全体の他の多くの行に現れる列値を持つ行を挿入する場合、その列でグループ化すると増分リフレッシュのパフォーマンスが低下します。 |
ターゲットテーブルの変更とクラスタリングの間の局所性。 |
増分リフレッシュが動的テーブルに変更を適用する場合、リフレッシュと削除は動的テーブルの現在の状態に対して結合されます。動的テーブルのクラスタリングと変更が一致する場合、この結合の実行がうまくいきます。 例えば、リフレッシュが最近挿入された行のみをリフレッシュするのであれば、テーブルのクラスタリングとうまく一致します。 Snowflakeテーブルの保存方法については、 Snowflakeテーブル構造について をご参照ください。テーブルのクラスタリングを管理するには、 自動クラスタリング を使用します。 |
各演算子の増分リフレッシュに対するパフォーマンス期待内容¶
次のテーブルは、各演算子の増分リフレッシュのおおよその期待されるパフォーマンスを示しています。パフォーマンスは、行の5%のみが変更され、リフレッシュジョブに少なくとも1分かかると仮定して、フルリフレッシュに対する相対値で測定されます。
注釈
クエリの最適化ではスピードアップしない固定オーバーヘッド(クエリの最適化、ウェアハウスのスケジューリング、ジョブのクリーンアップなど)のため、短いクエリ(10秒未満)のパフォーマンス向上はわずかである可能性があります。
演算子 |
パフォーマンス向上 |
---|---|
SELECT |
10x |
WHERE |
10x |
FROM |
10x |
UNION ALL |
10x |
スカラー集計 |
10x |
局所性の影響を受ける演算子については、局所性が良い場合と悪い場合の期待パフォーマンスをテーブルに示しています。演算子によっては、局所性が悪いとフルリフレッシュよりもパフォーマンスが低下する場合があることに注意してください。
演算子 |
局所性 |
パフォーマンス向上 |
---|---|---|
GROUP BY |
良い |
5x |
GROUP BY |
悪い |
1/3x |
DISTINCT |
良い |
5x |
DISTINCT |
悪い |
1/4x |
OVER |
良い |
2-5x |
OVER |
悪い |
1/5x |
INNER JOIN |
良い |
10x |
INNER JOIN |
悪い |
2x |
OUTER JOIN |
良い |
3x |
OUTER JOIN |
悪い |
0.1x |
詳細については、 演算子が増分リフレッシュする方法 をご参照ください。
複雑な動的テーブルに対する増分リフレッシュモードのパフォーマンスの最適化¶
動的テーブルには通常複数の演算子が含まれているため、増分リフレッシュによるパフォーマンス予測が難しくなります。このセクションでは、この課題に対処する方法を検討し、複雑な動的テーブルのパフォーマンスを向上させるためのヒントを示します。
複数の演算子が関係する場合、増分リフレッシュは、各演算子を別々に処理することで変更を計算し、入力に基づいた変更を計算できるクエリプランの断片に変えます。各入力に対して、この新しい断片は、変更前の入力、変更後の入力、または変更そのものを要求することができます。元のクエリのすべての演算子にこの処理を適用することで、変更スキャンとフルテーブルスキャンを組み合わせて変更を計算する新しいクエリプランが得られます。このプランはSnowflakeのクエリオプティマイザーによって最適化され、他のクエリと同様に実行されます。
増分リフレッシュがうまくいかない場合、たいていは変更が多すぎるか、局所性が低いことが原因です。クエリが複雑な場合、これらの問題の特定がより困難になります。増分演算子の性能は、通常、変更量と入力の局所性に依存します。しかし、これらの入力は他の演算子の出力であるため、演算子を通過するにつれてデータの量や局所性が変化する可能性があります。
したがって、複雑な増分・リフレッシュのパフォーマンスを理解するには、各演算子の入力を個別に考慮する必要があります。ここでは、よくあるシナリオとその対処法をご紹介します。
シナリオ |
推奨 |
---|---|
複数の列にまたがってテーブルを結合しているため、CLUSTERBYをすべての列で同時に使用することはできません。 |
頻繁に変更されるキーによる、大きなテーブルのクラスタリングを優先します。たとえば、大きなディメンションテーブルを持つスタースキーマでは、ディメンションテーブルのクラスタリングに集中します。 同じデータセットの複数のコピーを作成し、それぞれを異なるクラスタリングキーでクラスタリングし、関連するコンテキストで使用することを検討してください。 |
多くの結合にGROUPBYまたはOVERがあります。 |
ソーステーブルがグループ化/クラスタリング・キーによってクラスタリングされていることを確認し、結合と集約を2つの別々の動的テーブルに分割することを検討してください。 外部結合は集約との相互作用が弱いことに注意してください。 |