Snowflakeでクラスタリングキーを用いてクエリを効率化するには?(vol.7)

  • 公開日:2023年02月20日(月)

Snowflakeでは、TB(テラバイト)レベルのデータ量を持つ大規模テーブルに対するクエリの実行を効率化する方法の1つとして、クラスタリングキーを設定する方法があります。
本ブログ記事では、Snowflakeのクラスタリングキーとはどのようなものか、クエリを効率化するためのクラスタリングキーの設定方法はどうすればよいのか、解説します。

Snowflakeのクラスタリングキーとは?

クラスタリングキーは、同じマイクロパーティション*1内のテーブルのデータを共存させるために明示的に指定されたテーブル(またはテーブル上の式)の列のサブセットです。
*1:Snowflakeテーブル内のすべてのデータは、連続したストレージ単位である“マイクロパーティション”に自動的に分割されます。

例えば、データが作成またはロードされた時点で、ソートの順序が理想的ではないデータが大きなテーブルに対してクラスタリングキーを設定することで、データの取得時間を改善することが可能です。

Snowflakeは通常、テーブル内に適切にクラスタ化されたデータを生成しますが、時間経過によって数TBレベルのデータ量を持つ大規模テーブルになると、一部のテーブル行のデータが必要なディメンションに適切にクラスタ化されなくなる場合があります。
Snowflakeでは、テーブルのマイクロパーティションのクラスタリングを改善するために、1つ以上のテーブル列や式をテーブルのクラスタリングキーとして指定することが可能です。これにより、クエリパフォーマンスを改善できます。

クラスタリングキーは、テーブルの作成時や作成後に「ALTER TABLE」コマンドを使用することで作成できます。作成後は、いつでも変更または削除ができます。

Snowflakeでクラスタリングキーを使用するメリットと設定すべきテーブルとは?

TB(テラバイト)レベルのデータ量を持つ大規模テーブルに対して、クラスタリングキーを使用して同じマイクロパーティション内にデータを配置することで得られるメリットは、次の通りです。

  • Where句の条件と一致しないデータをスキップすることにより、クエリのスキャン効率が向上する
  • クラスタリングのないテーブルよりも、列圧縮が向上する
  • クラスタリングキーが定義された後、キーを削除または変更しない限り、追加の管理は必要ない
    →そのため、以降はテーブル内の行のメンテナンスは、Snowflakeによって自動的に実行されるようになる

ただし、1点注意すべきポイントがあります。
クラスタリングによりクエリパフォーマンスは大幅に改善され、一部のクエリのコストを削減できますが、クラスタリングの実行に使用される計算リソースはクレジットを消費します
そのため、クラスタリングをする際は、きちんとコストメリットを見極める必要があります。

コストメリットの見極めにあたり重要となる前提は、次の通りです。

  • クエリは通常、テーブルのクラスタリングキーでフィルター処理または並べ替えを行う場合、クラスタリングの恩恵を受ける
  • ソートは通常、「ORDER BY操作」、「GROUP BY操作」、および「一部の結合」に対して行われる

上記2点より、「頻繁にクエリ処理が行われるテーブルほど、クラスタリングが提供するメリットを享受できる」と言えますが、テーブルが頻繁に変更されるほど、クラスタ化を維持するのに費用がかかります。したがって、一般的にクラスタリングは、「頻繁にクエリされ、頻繁に変更されないテーブル」に対して費用対効果が高くなります

Snowflakeでクラスタリングキーを設定すべき列とは?

クラスタリングキーには、1つ以上の列や式を設定することができます。
Snowflakeでは、クラスタリングキーに最大3~4の列や式を推奨しています。3〜4を超える列を追加すると、メリットよりもコストが増加する傾向があります。
クラスタリングキーに適切な列や式を選択すると、クエリのパフォーマンスに大きな影響を与える可能性があります。ワークロードの分析により、通常、適切なクラスタリングキー候補が得られます。

Snowflakeでは、以下の順序でクラスタリングキーに優先順位を付けることをオススメしています。

  1. Where句で最もアクティブに使用されるクラスタ列
    日付ベースのWhere句を使用するクエリが多いテーブル(例:WHERE 請求日 > x AND 請求日 <= y」)の場合、請求日の列をクラスタリングキーに選択することをお勧めします。
  2. 結合条件で頻繁に使用される列(追加のクラスタリングキーの余地がある場合)
    例:「FROM table1 JOIN table2 ON table2.column_A = table1.column_B」の場合、結合条件に使用する列をクラスタリングキーする検討をしてください。

通常、クエリを2つの列(例:「application_id列」と「user_status列」)でフィルター処理する場合、両方の列でクラスタリングするとパフォーマンスが向上します。

カーディナリティが非常に低い列(例:男性か女性かのみを示す列)では、最小限の排除しかできません。カーディナリティが非常に高い列(例:ナノ秒のタイムスタンプ値を含む列)も、通常、クラスタリングキーとして使用する候補には適していません 。

まとめ

Snowflakeでは、クラスタリングキーを設定することでクエリパフォーマンスが改善されることや、クラスタリングキーが有効なテーブルやカラムについてご理解いただけたでしょうか?
是非、Snowflakeのクラスタリングキーをご活用いただくことで、現場のクエリパフォーマンスを改善していただければと思います。

弊社電通総研は、データマネジメントの専門家として、お客様のデータ一元管理やデータ活用における戦略策定、データドリブン経営の実現に向けた真の“使える”データマネジメント基盤構築のご支援をしております。
データ分析基盤の豊富な構築実績に基づくノウハウを体系化したサービスをご提供しておりますので、データ活用でお悩みの際は、是非、電通総研までお声掛けください。

◆ お問い合わせページ:https://itsol.dentsusoken.com/snowflake/inquiry/

*本記事は、2023年2月1日時点の情報を基に作成しています。
 製品・サービスに関する詳しいお問い合わせは、電通総研のWebサイトからお問い合わせください。