Snowflakeのマテリアライズドビュー機能とは? ~活用方法/注意点/コストを解説~(vol.25)
- 公開日:
Snowflakeには、クエリのパフォーマンス向上に役立つ「マテリアライズドビュー」という機能が存在します。ただし、「マテリアライズドビュー」は、適切に使用できなければ、クエリのパフォーマンスが向上しない場合があるので、注意が必要です。
そこで本ブログ記事では、「マテリアライズドビュー」の機能概要/設定方法/注意点/利用コストについて、わかりやすく解説します。
目次
Snowflake のマテリアライズドビュー機能とは?
Snowflakeのマテリアライズドビュー(Materialized Views)は、定義されたSELECT文のクエリの結果を事前に計算して保存することができる機能であり、この機能を活用することでクエリのパフォーマンスを向上させることが可能となります。
マテリアライズドビューの主な特徴について、4点ご紹介します。
- 事前計算されたデータセット
マテリアライズドビューは、定義されたSELECT文のクエリ結果を事前に計算し、保存します。これにより、後でクエリを実行する際、ベーステーブルに対して直接クエリを実行するよりも高速に結果を取得することができます。 - パフォーマンスの向上
特に、頻繁に実行されるクエリ や 複雑なクエリ に対して効果的です。
例えば、大規模なデータセットでの集計/射影/選択操作を高速化することができます。 - 自動メンテナンス
Snowflakeは、ベーステーブルに変更が加えられた後、マテリアライズドビューを自動的に更新します。これにより、常に最新のデータを提供することができます。 - コストと利便性
マテリアライズドビューの維持には、ストレージと計算コストがかかります。
そのため、頻繁に再利用されるクエリ結果に対して使用するのが効果的です。
マテリアライズドビューは次のクエリのようなCreate文を使用して作成します。
CREATE MATERIALIZED VIEW my_materialized_view AS
SELECT column1, column2, ...
FROM table_A
WHERE column1 = AAA;
ベーステーブルの一部カラムをマテリアライズドビューのカラムに定義することや、テーブルの結合、抽出条件の設定などを行うことが可能です。
*使用できない結合などの条件がありますので、後述いたします。
マテリアライズドビューを使用することで、データ分析の効率が大幅に向上しますが、コストとのバランスを考慮することが重要です。
次章では、マテリアライズドビューの活用方法・活用シーンについて解説します。
Snowflake マテリアライズドビューの活用方法・活用シーンとは?
本章では、マテリアライズドビューの活用方法・活用シーンを解説します。
- ビューでのクエリの検索パフォーマンスが悪い場合
スタンダードビューでクエリの検索パフォーマンスが悪い場合や、データ結合/データ加工処理のパフォーマンスが悪い場合は、マテリアライズドビューを使用することで、クエリのパフォーマンス向上が期待できます。
具体例として、ベーステーブルから販売日と販売地域を集計し、数百万のレコードが取得されるスタンダードビューにおいて、ビューの結果の処理が遅くなったケースにおけるマテリアライズドビューの活用方法を例示します。このスタンダードビューをマテリアライズドビューとして再作成し、
ALTER MATERIALIZED VIEW マテリアライズドビュー名 CLUSTER BY (販売日, 販売地域);
を実行します。
クラスタリングキーをマテリアライズドビューに設定可能なので、「1. ビューでのクエリの検索パフォーマンスが悪い場合」のようなケースでは、マテリアライズドビューを作成し、クラスタリングキーを設定することで、クエリの検索パフォーマンス向上を実現できます。
*ただし、データが頻繁に更新されない場合などの前提条件があります。注意すべきポイントについては、次章で解説いたします。 - ベーステーブルへのクラスタリングキーの設定などを行うことができない場合
データ集計のカラムにクラスタリングキーを設定する必要がある場合で、ベーステーブルへのクラスタリングキーの設定を行うと他の処理に影響が発生する場合は、マテリアライズドビューを作成し、集計カラムをクラスタリングキーに設定することで、クラスター化することが可能です。
こうしてマテリアライズドビューをクラスター化することで、ベーステーブルにはクラスタリングキーを設定する必要がなくなるため、ベーステーブルには影響を与えずに、検索処理のパフォーマンスを向上させることが可能になります。
マテリアライズドビューとしてのみではなく、クラスタリングキーと合わせることで、ベーステーブルへ影響を与えることなく検索パフォーマンスを向上させることが可能となります。
Snowflake マテリアライズドビューの注意点3選
Snowflakeのマテリアライズドビューは、クエリのパフォーマンスを向上させるために使用される機能ですが、使用方法によっては、パフォーマンスの向上ができなかったり、コスト面で問題が発生する場合があります。
マテリアライズドビューの使用にあたり、注意が必要な場面を3つご紹介します。
- 更新間隔などを指定したい場合
マテリアライズドビューは自動的に更新されます。
マテリアライズドビューは外部テーブルと異なり、データ更新の間隔や処理を行うクラスターの指定を行うことができません。更新処理が自動で行われるため、データ更新に関する設定をユーザーが行わなくてもいい点はメリットですが、更新間隔などを指定できない点で注意が必要です。 - ビューのベーステーブルが頻繁に変更される場合
Snowflakeは、ビューのベーステーブルが頻繫に更新される場合は、マテリアライズドビューの使用を推奨していません。ビューのベーステーブルが頻繫に更新される場合は、スタンダードビューの使用を推奨しております。 - 雑なクエリになる場合
マテリアライズドビューには作成条件があります。例えば、マテリアライズドビューのCreate文では、ネストされたサブクエリを含めることはできないといった作成条件が存在します。
そのため、複雑なクエリになる場合には、マテリアライズドビューを作成できない可能性がある点に注意が必要です。
以上3点が、マテリアライズドビューを使用する場合の注意点となります。
マテリアライズドビューはパフォーマンス向上を可能とする機能ですが、マテリアライズドビューの特性に合った要件をクリアしているのか、そもそもマテリアライズドビューが作成可能な条件を満たしているのかを確認したうえで、使用可否の判断や動的テーブルなどのパフォーマンス向上を行う他の機能を適用するかの検討を行いましょう。
Snowflake マテリアライズドビューの利用コストとは?
Snowflakeのマテリアライズドビューは、クエリの結果を事前に計算して保存することで、クエリのパフォーマンスを向上させる機能です。しかし、マテリアライズドビューの利用にあたっては、次のコストが発生します。
- ストレージ利用料金
マテリアライズドビューは、クエリの結果を物理的に保存するため、ストレージを消費します。
そのため、保存したデータ量に応じたストレージコストが発生します。 - コンピュート利用料金
ベーステーブルに変更が加えられるたびに、マテリアライズドビューも自動的に更新されます。
この更新プロセスにはクレジットが消費されます。
Snowflakeには、マテリアライズドビューと似たような機能として、「動的テーブル(Dynamic Table)」という機能が存在します。
※動的テーブルについては、「Snowflake動的テーブル(Dynamic Table)とは?~機能と活用方法を解説~(vol.20)」に詳細を記載しておりますので、本ブログ記事と併せてご確認ください。
マテリアライズドビューと動的テーブルのどちらの機能を使用するかをコスト面で比較検討したいという場合に備えて、それぞれの課金が発生する仕組みを理解しておきましょう。
まず、ストレージコストについて、マテリアライズドビューと動的テーブルの課金の仕組みを解説します。
マテリアライズドビューは、ストレージにクエリの結果を保存するため、保存されたデータ量に応じてストレージコストがかかります。
これは、動的テーブルも同様です。
つまり、更新頻度が同じであれば、マテリアライズドビューと動的テーブルのストレージコストは同じとなります。
ただし、マテリアライズドビューは自動更新されますが、動的テーブルは更新間隔を指定することが可能なため、更新間隔を長くすることで、ストレージコストを抑えることが可能となります。
*当たり前の話ですが、更新間隔が長いということは、次に更新されるまでの間、動的テーブルのデータが古い状態が長く続くことになるので、注意しましょう。
次に、コンピューティングコストについて、マテリアライズドビューと動的テーブルの課金の仕組みを解説します。
データ更新を行うとコンピューティングコストが発生する点は、マテリアライズドビューも動的テーブルも同じですが、課金の仕組みについては大きく異なります。
- マテリアライズドビューの場合
ベーステーブルに更新が発生した場合、更新に使用したコンピューティングコストが発生します。 - 動的テーブルの場合
動的テーブルは参照元データが更新された後にデータを更新します。更新処理は動的テーブルを作成したSQLに記載されているウェアハウスで行われるため、ウェアハウスのサイズや動作時間に基づいてコンピュートコストが発生します。
動的テーブルは、更新間隔を設定した時間ごとに更新有無のチェックをベーステーブルに対して行うため、更新間隔を短時間で設定すると、その分コンピューティングコストが増加します。
*コストを抑えようとして更新間隔を長めの時間で設定すると、データ更新にタイムラグが発生するため、動的テーブルのデータがベーステーブルのデータと異なる状態が発生する可能性が高まることに注意しましょう。
マテリアライズドビューと動的テーブルの課金の仕組みの違いをきちんと理解したうえで、どちらを使用してクエリのパフォーマンス向上を行うのかを検討しましょう。
マテリアライズドビューの利用コストを把握したい場合は、以下のクエリを使用することで、過去30日間で消費したクレジットを日別で表示することが可能です。
SELECT TO_DATE(start_time) AS date,
database_name,
schema_name,
table_name,
SUM(credits_used) AS credits_used
FROM snowflake.account_usage.materialized_view_refresh_history
WHERE start_time >= DATEADD(month,-1,CURRENT_TIMESTAMP())
GROUP BY 1,2,3,4
ORDER BY 5 DESC;
まとめ
ここまで、Snowflakeの「マテリアライズドビュー」について、機能概要/設定方法/注意点/利用コストを解説してまいりました。
Snowflakeの「マテリアライズドビュー」を活用することで、クエリのパフォーマンス向上が可能となりますので、クエリのパフォーマンスでお悩みの方は、ご参考にしていただければと思います。
弊社は、お客様ごとの要件(用途/データ連携元の環境構成/今後の活用方法など)に応じたデータ分析基盤の構築/拡充や、各種パフォーマンスを向上するための機能追加/運用変更、データ活用を推進するためのデータマネジメント体制の整備などをご支援しております。
Snowflakeを用いたデータ活用でお悩みの際は、是非、弊社までお声掛けください。
本記事は、2024年8月21日時点の情報を基に作成しています。製品・サービスに関する詳しいお問い合わせは、弊社Webサイトからお問い合わせください。
https://itsol.dentsusoken.com/snowflake/inquiry/